dojo异步编程之dojo/Deferred

dojo/Deferred是Dojo库中用于管理异步操作的关键组件,它允许开发者延迟执行直到特定事件发生。Deferred对象有初始化、解决(resolve)和拒绝(reject)三种状态。通过调用then方法注册回调函数,可以分别处理成功和失败的情况。此外,提供.cancel()方法用于取消异步操作。文中通过实例展示了如何使用Deferred进行异步操作并监控其状态变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());
        })

输出结果如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值