dojo/Deferred介绍
dojo/Deferred是一个类,是Dojo中管理异步线程的基础。 简单来说,一个Deferred对象会等待一段时间再去执行指定的调用,直到某个特定的事件发生或者前一个动作完成。Ajax就是一种常见的例子: 发出一个Ajax请求之后,我们需要等待服务器把响应返回之后才会调用处理函数。所以Deferred对象提供给我们的就是这种将某个动作延迟并等待某个事件发生的能力。
用法
Deferred对象有三个状态,初始化时是”unresolve” 状态,当它所等待的事件发生时, 进入”resolve” 状态, 第三种状态是出错状态,即该事件没有按照预期的发展,例如服务器端返回了错误消息,也称reject 状态。
创建Deferred对象后,我们可以通过调用该对象的then方法注册一个回调函数,表示当这个Deferred对象等待的某个事件发生时(resolve),就调用该回调函数。then 方法还接受第二个参数,可以制定当事件失败或出错时(reject)时调用的出错回调函数 。调用者还可以在外部调用.cancel()来取消启动的线程。
dojo/Deferred
包含以下属性:
属性 | 描述 |
---|---|
promise | 指向对象关联的dojo/promise/Promise即返回对象 |
isResolved() | 判断deferred是否已经完成(true,false) |
isRejected() | 判断deferred是否被拒绝 |
isFulfilled() | 判断deferred是否已经完成或被拒绝 |
isCanceled() | 判断deferred是否已经取消 |
progress(update, strict) | 通过异步调用提供进度更新。可用于在异步操作完成之前进行沟通更新过程。参数update为更新的进展对象,strict为可选的boolean,为ture且promise已经为fulfilled状态时调用进度更新会抛出异常。返回值为原始deferred的promise。 |
resolve(value, strict) | 通过异步调用,当完成时将结果传递给回调函数执行,标识为成功状态。参数value为deferred的结果,用于传递给callback回调函数,strict为可选的boolean,为ture且promise已经为fulfilled状态时调用resolve会抛出异常。 |
reject(error, strict) | 通过异步调用,拒绝deferred的执行,标识为错误状态。参数error为deferred错误的结果,用于传递给errback回调函数,strict为可选的boolean,为ture且promise已经为fulfilled状态时调用reject会抛出异常。 |
then(callback, errback, progback) | 给deferred添加回调函数。参数都是可选的function,依次表示deferred完成(resolved)、拒绝(rejected)、更新进度(progress)的回调函数。返回值是一个表示回调函数结果的新的promise对象。可用于链接多个异步操作。 |
cancel(reason, strict) | 通知取消异步操作。参数reason表示取消操作的原因,strick为可选的boolean,为ture且deferred已经为fulfilled状态时调用cancel会抛出异常。返回值是取消的原因,deferred有canceler时,将原因进行加工后返回消息。 |
示例
1、在下面的例子中,使用setTimeout()
函数创建异步进程,异步调用3秒完成,每秒发送一个进度更新progress,然后异步结束resolve,结束前后检查isResolved、isFulfilled状态。
require(['dojo/Deferred'],function(Deferred){
var deferred = new Deferred();
deferred.then(
function(result){
console.log("success"+result+'\t'+Date());
console.log("isResolved="+deferred.isResolved());
console.log("isFulfilled="+deferred.isFulfilled());
},
function(err){
console.log("error"+err+'\t'+Date());
},
function(progress){
console.log("progress"+progress+'\t'+Date());
}
)
setTimeout(function(){deferred.progress(1);},1000);
setTimeout(function(){deferred.progress(2);},2000);
setTimeout(function(){deferred.progress(3);},3000);
setTimeout(function(){deferred.resolve("ok");},3001);
//等待异步操作回调函数执行过程中下面的代码会同时执行
console.log("isResolved="+deferred.isResolved());
console.log("isFulfilled="+deferred.isFulfilled());
})
结果如下:
2、异步调用3秒完成,每秒发送一个进度更新progress,在第二秒后然后异步结束reject,结束前后检查isRejected、isFulfilled状态。
require(['dojo/Deferred'],function(Deferred){
var deferred = new Deferred();
deferred.then(
function(result){
console.log("success"+result+'\t'+Date());
},
function(err){
console.log("error"+err+'\t'+Date());
console.log("isResolved="+deferred.isRejected());
console.log("isFulfilled="+deferred.isFulfilled());
},
function(progress){
console.log("progress"+progress+'\t'+Date());
}
)
setTimeout(function(){deferred.progress(1);},1000);
setTimeout(function(){deferred.progress(2);},2000);
setTimeout(function(){deferred.progress(3);},3000);
setTimeout(function(){deferred.reject("error message");},2001);
console.log("isResolved="+deferred.isRejected());
console.log("isFulfilled="+deferred.isFulfilled());
})
输出结果如下: