博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Appcan开发笔记:结合JQuery的$.Deferred()完善批量异步发送
阅读量:6898 次
发布时间:2019-06-27

本文共 2120 字,大约阅读时间需要 7 分钟。

appcan的 uexXmlHttpMgr.send 或者 appcan.ajax无法同步请求(没有找到这个属性),只能异步,造成循环多次提交时由于延迟或网络堵塞等原因无法同步响应,导致提交顺序混乱,执行完后回调错误或丢数据,如传统方法(这里已经引用的JQ包)
1 var data=[]; 2 var d=[1,2,3,4,5,6]; 3 $.each(d, function(i, v) { 4         var req = uexXmlHttpMgr.create({ 5             method : "GET", 6             url :myurl 7         }) 8         uexXmlHttpMgr.send(req, 0, function(status, resStr, resCode, resInfo) { 9             if (status == 1) {10                 data.push(i+"OK");11             }12         });13 });14 alert(JSON.stringify(data))

 

输出结果为[],因为调用了多次回发,输出data时each和请求都没有执行完毕所以data中肯定是没有值的。
这时引用$.Deferred(),例子如下
1   var dtd = $.Deferred(); // 新建一个Deferred对象 2   var wait = function(dtd){ 3     var tasks = function(){ 4       alert("执行完毕!"); 5       dtd.resolve(); // 改变Deferred对象的执行状态 6     }; 7     setTimeout(tasks,5000); 8     return dtd; 9   };10   $.when(wait(dtd))11   .done(function(){ alert("哈哈,成功了!"); })12   .fail(function(){ alert("出错啦!"); });

 

 
这里不做过多说明,$.Deferred()的用法详解:

结合appcan请求 得到如下代码
1 var d = [1, 2, 3, 4, 5, 6]; 2 var data = []; 3 var sendalldata = function() { 4     var dtdall = $.Deferred(); 5     $.each(d, function(i, v) { 6         var io = i; 7         var req = uexXmlHttpMgr.create({ 8             method : "GET", 9             url : myurl10         })11         uexXmlHttpMgr.send(req, 0, function(status, resStr, resCode, resInfo) {12             if (status == 1) {13                 console.log("结果" + i + ":" + resStr);14                 resStr = eval('(' + resStr + ')');15                 data.push(resStr.toString())16                 if (d.length == count) {17                     dtdall.resolve(JSON.stringify(data));18                 }19             }20         });21     })22     return dtdall.promise();23 }24 $.when(sendalldata()).done(function(v1) {25     console.log(v1)26     v1 = eval('(' + v1 + ')');27     console.log("结果v1" + ":" + JSON.stringify(v1));28 });

 

输出结果为预期(运行环境为ID4.0)。
 
另外还有两种解决办法,第一种是网上比较常见的无限循环,但是如果还有复杂的回调代码就会很混乱,以上代码中 if (d.length == count) {... 其实也有点无限循环的意思;
第二种是使用js原生方法promise,但是appcan内核还没有到ES6(Array.prototype.filter和Array.prototype.map都没有还是自己扩展的 ),所以这个方法也抛弃了。
 

转载地址:http://vscdl.baihongyu.com/

你可能感兴趣的文章
剑指offer四之重建二叉树
查看>>
Eclipse工具栏太多,自定义工具栏,去掉调试
查看>>
iOS开发】之CocoaAsyncSocket使用
查看>>
使用ss命令代替 netstat
查看>>
Maven的作用及简介
查看>>
08-hibernate注解-多对多单向外键关联
查看>>
Tomcat下使用Druid配置JNDI数据源
查看>>
神经网络中embedding层作用——本质就是word2vec,数据降维,同时可以很方便计算同义词(各个word之间的距离),底层实现是2-gram(词频)+神经网络...
查看>>
SQL Server 临时表的删除
查看>>
ElasticSearch安装部署,基本配置(Ubuntu14.04)
查看>>
nginx优化缓冲缓存
查看>>
最新的Zynq资料整理
查看>>
AS 功能 设置 SDK AVD 简介 MD
查看>>
MySql之存储过程的使用
查看>>
17秋 SDN课程 第四次上机作业
查看>>
gradle windows上面安装配置
查看>>
基于 HTML5 WebGL 的 3D SCADA 主站系统
查看>>
CentOS上安装分布式文件系统FastDFS & 配置和问题解决
查看>>
Netty 包头
查看>>
Unity3D Asset文件导出3DMax 可编辑格式
查看>>