promise学习(2)

原文地址javascript

1. 在then中使用reject

若是一个promise最初只定义了resolve,可是还想要使用reject怎么办?

能够在then中返回一个新的promise。这个retPromise 对象状态为Rejected的时候,会调用后面then中的 onRejected 方法,这样就实现了即便在then 中不使用 throw 也能进行reject处理了。java

var onRejected = console.error.bind(console);
var promise = Promise.resolve();
promise.then(function () {
    var retPromise = new Promise(function (resolve, reject) {
       reject(new Error("this promise is rejected"));
    });
    return retPromise;
}).catch(onRejected);
// 使用Promise.reject还能够简化书写
var onRejected = console.error.bind(console);
var promise = Promise.resolve();
promise.then(function () {
    return Promise.reject(new Error("this promise is rejected"));  // 注意 Promise.reject其实只是new Promise的简洁写法   做用是同样的
}).catch(onRejected);

若是想直接更改promise的状态,那么使用reject()比使用throw要安全。 若是直接使用throw,就不太容易区分是主动抛出的error,仍是代码中的errorjquery

2. Deferred和Promise之间的关系

(以jquery.deferred相似实现为例)git

deferredpromise不是竞对,deferred包含promisedeferred具有对promise状态进行操做的特权方法。github

所谓的能对Promise状态进行操做的特权方法,指的就是能对promise对象的状态进行resolvereject等调用的方法,而一般的Promise的话只能在经过构造函数传递的方法以内对promise对象的状态进行操做。promise

Promise 通常会在构造函数中编写逻辑,何时执行fulfilled回调,何时执行rejected回调。可是deferred只要定义一个对象以后,能够在任意时间调用resolve或者reject方法。安全

deferred最后返回return deferred.promise 能够继续链式调用。异步

换句话说,Promise表明了一个对象,这个对象的状态如今还不肯定,可是将来一个时间点它的状态要么变为正常值(FulFilled),要么变为异常值(Rejected);而Deferred对象表示了一个处理尚未结束的这种事实,在它的处理结束的时候,能够经过Promise来取得处理结果。函数

3. thenable对象

thenable对象能够经过Promise.resolve转化成Promise对象。thenable对象就是一个具备 .then方法的一个对象。那么普通的callback也能够经过添加then方法变成thenable对象,这个转换过程是在resolve中进行的,转换中添加的then方法与后面使用 .then异步执行回调的then不是同一回事。学习

Todos:

  • promise 任务队列原理
  • promise扩展库是如何获取promise的状态以及取消promise动做的
  • promise反模式

4. 学习方法

学习以前要对所学的东西有个整体上的计划和步骤,有条理有重点的去开展。边学习边记录的方法虽然也没错,可是当你看完以后发现知识点都是零散的,也仍是须要整理汇总。

由点到面再到点,这样后续总结回顾的时候也可以很清楚的找到重点和难点。

相关文章
相关标签/搜索