PhoneGap Plugin与Wind.js结合,实现异步通信

简介: <p>    <span style="font-size:10px"><span style="background-color:rgb(255,255,255)">  最近在做一个的ios的App。项目</span><span style="font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:19px

      最近在做一个的ios的App。项目选择了PhoneGap的移动跨平台框架。数据部分因为是某一小说网站的数据,通过ajax的跨域无法直接获取,所以考虑Hybrid模式,把这一部分放在原生那里去处理,然后通过Plugin来与页面JavaScript通信。到这里问题出来了:在PhoneGap中,Plugin不是异步通信的。在执行通信模块的时候,页面是不能动的,会出现假死的现象,页面的loading也无法动。

      查了很久的资源,发现:PhoneGap的javascript脚本与原生(iOS,android,wp等)的API的plugin交互,采用与浏览器webkit中的webview进行通信,而它的底层原理就是iframe的交互,它是以一种特定规范的通信协议来展开,而在传统的web上iframe的使用本身就是最原始的异步加载原理的使用。所以,没有办法异步方式在phonegap的开发中广泛使用。

      后来找到了老赵的Wind.js框架。通过简单的代码修改后。终于把问题解决了。下面是相关的内容与解决的方法。

      首先介绍一下老赵的Wind.js:

      官方链接:http://windjs.org/

      开源链接:https://github.com/JeffreyZhao/wind

      Wind.js的异步模块文档:http://windjs.org/cn/docs/async/

      Wind.js简单的介绍:

      Wind.js的前身为Jscex,即JavaScript Computation EXpressions的缩写,它为JavaScript语言提供了一个monadic扩展,能够显著提高一些常见场景下的编程体验(例如异步编程)。Wind.js完全使用JavaScript编写,能够在任意支持JavaScript的执行引擎里使用,包括各浏览器及服务器端JavaScript环境(例如Node.js)。

        

       没有引用Wind.js之前我的代码:

       call.js:

var getNovelNames = function(url){
    console.log("与原生交互...");
	cordova.exec(
		function(result){
            		console.log("交互成功...");
			var html = '';
			var novelNames = result;
			for(var i=0; i<novelNames.length; i++){
				html +='<li><a href="#page2" data-transition="slide">'+novelNames[i]+'</a></li>';
			}
			
			$("#daylist").append(html);
           		$.mobile.hidePageLoadingMsg();
		},
		function(error){
            		alert('亲,服务器繁忙,请重新刷新页面...');
        	},
		'CallPlugin',
		'getNovelNames',
		[url]
	);
};

index.js:

document.addEventListener('deviceready',function(){

                $.mobile.loadingMessageTextVisible = false;
                $("#day").bind("click",function(){
                            $.mobile.showPageLoadingMsg();
                            var url = '***'; //这里为某网站的URL暂时屏蔽
                            getNovelNames(url);
          });
 },true);

        引入Wind.js

        首先在页面引入:

<script type="text/javascript" src="js/wind-all-0.7.3.js"></script>

    call.js变为:

var asyncNovelNames = function(url){
        $await(Wind.Async.sleep(1000)); //这里停1s是为了让loading看清楚。App上线后应移除
	cordova.exec(
		function(result){
			var html = '';
			var novelNames = result;
			for(var i=0; i<novelNames.length; i++){
				html +='<li><a href="#page2" data-transition="slide">'+novelNames[i]+'</a></li>';
			}
			
			$("#daylist").append(html);
                        $.mobile.hidePageLoadingMsg();
		},
		function(error){
                        alert('亲,服务器繁忙,请重新刷新页面...');
                },
		'CallPlugin',
		'getNovelNames',
		[url]
	);
};

var getNovelNames =eval(Wind.compile("async", asyncNovelNames));

     index.js 修改为:

document.addEventListener('deviceready',function(){
                $.mobile.loadingMessageTextVisible = false;
                $("#day").bind("click",function(){
                            $.mobile.showPageLoadingMsg();
                            var url = '***';//这里为某网站的URL暂时屏蔽
                            var task = getNovelNames(url);
                            task.start();
                });
            },true);

       修改完成后,发现App还是会有假死的问题,检查发现是原生问题的代码执行的时候,如果时间过长还是会影响页面的显示,这与website的区别很大。之前一直在做JavaEE方面的项目,所以一下直没考虑到这样的问题。后来将数据请求问题的NSURLConnection改成是委托代理的模式。数据通信问题问题解决。



目录
相关文章
|
1月前
|
前端开发 JavaScript
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
87 58
|
8天前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8天前
|
消息中间件 JavaScript 前端开发
最细最有条理解析:事件循环(消息循环)是什么?为什么JS需要异步
度一教育的袁进老师谈到他的理解:单线程是异步产生的原因,事件循环是异步的实现方式。 本质是因为渲染进程因为计算机图形学的限制,只能是单线程。所以需要“异步”这个技术思想来解决页面阻塞的问题,而“事件循环”是实现“异步”这个技术思想的最主要的技术手段。 但事件循环并不是全部的技术手段,比如Promise,虽然受事件循环管理,但是如果没有事件循环,单一Promise依然能实现异步不是吗? 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您
|
1月前
|
Web App开发 JavaScript 前端开发
如何在JavaScript中确定异步操作之间的依赖关系?
如何在JavaScript中确定异步操作之间的依赖关系?
26 1
|
4月前
|
JSON 前端开发 JavaScript
在 JavaScript 中,如何使用 Promise 处理异步操作?
通过以上方式,可以使用Promise来有效地处理各种异步操作,使异步代码更加清晰、易读和易于维护,避免了回调地狱的问题,提高了代码的质量和可维护性。
|
5月前
|
前端开发 JavaScript 开发者
JS 异步解决方案的发展历程以及优缺点
本文介绍了JS异步解决方案的发展历程,从回调函数到Promise,再到Async/Await,每种方案的优缺点及应用场景,帮助开发者更好地理解和选择合适的异步处理方式。
|
5月前
|
移动开发 JavaScript 前端开发
【JavaScript】JS执行机制--同步与异步
【JavaScript】JS执行机制--同步与异步
50 1
|
5月前
|
JavaScript 前端开发
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
|
6月前
|
JavaScript 前端开发
一个js里可以有多少个async function,如何用最少的async function实现多个异步操作
在 JavaScript 中,可以通过多种方法实现多个异步操作并减少 `async` 函数的数量。
|
6月前
|
JSON 前端开发 JavaScript
一文看懂 JavaScript 异步相关知识
一文看懂 JavaScript 异步相关知识
54 4