原文地址javascript
能够在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
,仍是代码中的error
。jquery
(以jquery.deferred
相似实现为例)git
deferred
和promise
不是竞对,deferred
包含promise
。deferred
具有对promise
状态进行操做的特权方法。github
所谓的能对Promise
状态进行操做的特权方法,指的就是能对promise
对象的状态进行resolve
、reject
等调用的方法,而一般的Promise
的话只能在经过构造函数传递的方法以内对promise
对象的状态进行操做。promise
Promise
通常会在构造函数中编写逻辑,何时执行fulfilled
回调,何时执行rejected
回调。可是deferred
只要定义一个对象以后,能够在任意时间调用resolve
或者reject
方法。安全
deferred
最后返回return deferred.promise
能够继续链式调用。异步
换句话说,Promise
表明了一个对象,这个对象的状态如今还不肯定,可是将来一个时间点它的状态要么变为正常值(FulFilled)
,要么变为异常值(Rejected)
;而Deferred
对象表示了一个处理尚未结束的这种事实,在它的处理结束的时候,能够经过Promise
来取得处理结果。函数
thenable
对象能够经过Promise.resolve
转化成Promise
对象。thenable
对象就是一个具备 .then
方法的一个对象。那么普通的callback
也能够经过添加then
方法变成thenable
对象,这个转换过程是在resolve
中进行的,转换中添加的then
方法与后面使用 .then
异步执行回调的then
不是同一回事。学习
Todos:
学习以前要对所学的东西有个整体上的计划和步骤,有条理有重点的去开展。边学习边记录的方法虽然也没错,可是当你看完以后发现知识点都是零散的,也仍是须要整理汇总。
由点到面再到点,这样后续总结回顾的时候也可以很清楚的找到重点和难点。