Dojo Deferreds 和 Promises

Deferred 与  Promise 的关系

Promise的定义: https://promisesaplus.com/ 或者 http://www.alloyteam.com/2014/05/javascript-promise-mode/

  •  简单的说, promise有三种状态
  1. pending状态,pending 状态 可以到 fulfilled 或者 rejected状态 (新创建时)
  2. fulfilled状态,不能改变到其它状态,并且接受一个成功返回的值 (当调用Deferred resolve 或者说 Ajax 请求成功后都会设置状态为 fulfilled)
  3. rejected状态, 不能改变到其它状态,并且接受一个拒绝的原因 (当调用Deferred reject方法,或者调用了 Deferred cancel方法(内部调用reject方法) )
  •   promise 必须提供一个then 方法,对于then方法的要求可以查看 https://promisesaplus.com/
Promise 只是一个承诺,根据自己的状态(fulfilled, rejected, 通过singalListner触发不同信号) , 而执行then 方法中定义的回调函数。 但是这个状态的修改,需要 Deferred去调用resolve 或 reject.   
Deferred 从字面上认识,一个迟延操作,它有执行的过程(PROGRESS), 执行成功(RESOLVED), 或者 (REJECTED).  执行成功和执行失败,都会修改Promise的状态。

让我们还是能过代码, 了解两者之间的关系

第一种情况: 直接定义一个Promise对像
        
 var  promise = new Promise();
      promise.then()  // 抛出一个错误


     所以不能直接初始化一个Promise对像, 因为dojo/promise/Promise只是一个抽像类,而没有具体的方法,调用then方法,throw new TypeError("abstract"); 而且Promise规范中没有要求定义修改状态的方法
     比如,resolve 和 reject

 第二种情况: 定义一个Deferred 对像
var deferred = new Deferred();  // deferred 对像也拥有 then 方法,用于添加回调函数, 跟deferred.promise.then 的操作是一样的
                                        // 但如果只返回 这个deferred.promise的话,就没办法调用resolve reject等方法
var promise = deferred.then(function(a){}(console.log(a), function(err){console.log(err)); // 跟deferred.promise.then是一样的。

第三种情况,包装到第三方对像,并返回一个Promise,   dojo/request
     
   var req = request("/");  // 在ajax中, 要初始化一个deferred对像(私有接口, 不会返回这个对像,request 对像会内部操作 deferred.resolve, 及 deferred.reject), 并返回这个deferred 的promise;

原理以及源代码的可以查看  github.  

Promise 的使用 

翻译官方教程 http://dojotoolkit.org/documentation/tutorials/1.10/promises/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值