dojo异步编程 dojo/Deferred
来源:互联网 发布:淘宝小号批量购买 编辑:程序博客网 时间:2024/05/18 04:00
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后回调。
1、resolve:该deferred完成。
2、reject:该deferred发生错误。
3、cancel:取消所有回调,即不再关心该deferred对象。
4、progress:更新deferred对象状态。
5、isResolved:若调用过resolve函数返回true
6、isRejected:若调用过reject函数返回true
7、isFulfilled:若调用过resolve、reject或cancel三者之一返回true
8、isCanceled:若调用过cancel函数返回true
仅从上面的例子还真看不出这东西有什么实际用处。那如果让你封装一个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源码,代码写的很不错。
- dojo异步编程 dojo/Deferred
- dojo.Deferred
- dojo之异步编程
- 学习dojo Deferred
- dojo 1.6 官方教程:dojo.Deferred 初探
- dojo异步编程之dojo/promise/all模块(dojo/DeferredList替代者)
- dojo
- dojo
- Dojo
- dojo
- dojo
- dojo
- dojo.Deferred 管理回调函数
- 2016-07-07 dojo.Deferred函数测试
- web前端之精通dojo六:异步编程
- dojo切面编程(dojo/aspect模块)
- Dojo Javascript 编程规范
- Dojo Javascript 编程规范
- poj 2263 重型运输
- Eclipse for Python with plugin not online
- android cookbook
- Magick++ 6.8.5在MFC中的使用
- Peoplecode to Create BI publisher XML and XSD Data source file.
- dojo异步编程 dojo/Deferred
- 几个随机算法
- service archiver Error : Class not found
- JAVA连接DB2
- 项目记录
- 如何安装gcc
- ios block传值
- Mac OS X Snow Leopard 开启Web共享,建立Web服务器:Apache+PHP+MySql
- JAVASE----18----网络编程