1. 在then中使用reject
如果一个promise最初只定义了resolve,但是还想要使用reject怎么办?
可以在then
中返回一个新的promise
。这个retPromise
对象状态为Rejected的时候,会调用后面then
中的 onRejected
方法,这样就实现了即使在then
中不使用 throw
也能进行reject
处理了。
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
,还是代码中的error
。
2. Deferred和Promise之间的关系
(以jquery.deferred
类似实现为例)
deferred
和promise
不是竞对,deferred
包含promise
。deferred
具备对promise
状态进行操作的特权方法。
所谓的能对Promise
状态进行操作的特权方法,指的就是能对promise
对象的状态进行resolve
、reject
等调用的方法,而通常的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. 学习方法
学习之前要对所学的东西有个总体上的计划和步骤,有条理有重点的去开展。边学习边记录的方法虽然也没错,但是当你看完之后发现知识点都是零散的,也还是需要整理汇总。
由点到面再到点,这样后续总结回顾的时候也能够很清楚的找到重点和难点。