dojo异步编程 dojo/Deferred
发布时间:2020-12-16 21:37:00 所属栏目:百科 来源:网络整理
导读:Email:longsu2010 at yeah dot net JavaScript的事件回调真的很棒,比如AJAX获取数据在数据返回时执行某函数,比如websocket获取数据后执行某函数,比如JSONP…… dojo的dojo/Deferred用于开启一个异步程序,对于封装通用组件特别有用。 下面介绍dojo/Deferr
Email:longsu2010 at yeah dot net JavaScript的事件回调真的很棒,比如AJAX获取数据在数据返回时执行某函数,比如websocket获取数据后执行某函数,比如JSONP…… dojo的dojo/Deferred用于开启一个异步程序,对于封装通用组件特别有用。下面介绍dojo/Deferred的用法, 从一个小例子开始。(本例使用chrome) require(["dojox/store/proxyStore","dojo/Deferred"],function( ProxyStore,Deferred){ var deferred = new Deferred(); // 设置回调函数 deferred.then(function(args){ console.log(args); },function(args){ console.log(args); },function(args){ console.log(args); }); // 更新状态 deferred.progress("progress"); // 正常完成 deferred.resolve("resolve"); // 有错误发生 // deferred.reject(); // 取消异步程序 // deferred.cancel(); });可以看出使用Deferred需要先创建一个Deferred对象,之后用then方法设置该对象的回调函数,之后可以用例子中的其他几个函数来更新Deferred对象的状态。Deferred对象会根据不同的状态来调用不同的回调函数。 Deferred对象除了提供例子中改变状态的函数外还提供了判断状态的函数,各函数含义: 0、then:设置回调函数,一共可设置三个回调函数,第一参数在调用resolve后回调,第二参数在调用reject和cancel后回调,第三参数在调用progress后回调。 仅从上面的例子还真看不出这东西有什么实际用处。那如果让你封装一个websocket请求的公共模块呢?要求该模块提供一个query方法,通过query方法获取websocket服务端的数据。由于websocket是异步的,query的返回值不可能是获取的数据,这时候返回一个Deferred对象就比较合适了。如下为该模块的伪代码(仅示例性的写写)。 define(["dojo/Deferred"],function(Deferred){ var deferreds = []; var websocket = new WebSocket("ws://127.0.0.1:12580"); websocket.onmessage = function(evt){ var data = JSON.parse(evt.data); if(data.success){ deferreds.shift().resolve(data); }else{ deferreds.shift().reject(data); } }; return { query : function(url){ var deferred = new Deferred(); deferreds.push(deferred); websocket.send(url); return deferred; } }; });该模块的使用方法为: // 省略模块导入代码, 假设导入名字为dataProxy。 var rs = dataProxy.query("name=ddd"); rs.then(function(args){ console.log("获取数据成功, 数据为:",args); },function(args){ console.log("获取数据失败,错误信息为:",args); });可以看出,Deferred对象很多时候是作为函数返回值使用的,之后在该返回值上用then注册回调函数,当Deferred对象状态改变时回调函数被执行。 值得说明的一点是then的返回值仍然是一个异步对象,所以可以这样写 rs.then(function(){ return 1; }).then(function(){ return 2; }).then(function(){ return 3; }) 执行顺序为从前到后。 有时间建议读一读dojo/Deferred.js源码,代码写的很不错。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |