原文地址1.在then中使用reject如果一个promise一开始只定义了resolve,还想使用reject怎么办?然后可以返回一个新的承诺。当这个retPromise对象的状态为Rejected时,后面会调用then中的onRejected方法,这样then中即使不使用throw也能处理reject。varonRejected=console.error.bind(console);varpromise=Promise.resolve();promise.then(function(){varretPromise=newPromise(function(resolve,reject){reject(newError("这个承诺isrejected"));});returnretPromise;}).catch(onRejected);//使用Promise.reject也可以简化写法varonRejected=console.error.bind(console);varpromise=Promise.resolve();promise.then(function(){returnPromise.reject(newError("thispromiseisrejected"));//注意Promise.reject其实只是一个简洁的newPromise,效果一样}).catch(onRejected);如果想直接改变promise的状态,使用reject()比throw更安全。如果直接用throw,不容易区分是主动抛出的错误还是代码中的错误。2、Deferred和Promise的关系(以jquery.deferred的类似实现为例)deferred和promise不是竞争对手,deferred包含promise。Deferred具有在promise状态上运行的特权方法。所谓可以对Promise状态进行操作的特权方法是指可以resolve、reject等promise对象状态的方法,而通常的Promise只能在通过构造函数传递的方法内部使用。状态进行操作。Promise一般在构造函数中写逻辑,什么时候执行fulfilled回调,什么时候执行rejected回调。但是deferred可以在定义一个对象之后随时调用resolve或者reject方法。Deferred最后返回returndeferred.promise继续链式调用。换句话说,Promise代表了一个对象,它现在的状态是不确定的,但在未来的某个时刻,它的状态要么变成正常值(FulFilled),要么变成异常值(Rejected);而Deferred对象代表的是一个处理还没有结束的事实,当它的处理结束时,可以通过Promise获取处理结果。3.Thenable对象thenable对象可以通过Promise.resolve转换为Promise对象。thenable对象是具有.then方法的对象。普通回调也可以通过添加then方法变成thenable对象。这个转换过程是在解析中进行的。转换中添加的then方法与后面使用.then异步执行回调的then不同。Todos:Promise任务队列原理promise扩展库如何获取promise的状态和取消promise动作的promise反模式?执行。边学边记录的方法虽然是正确的,但是看完之后发现知识点比较分散,还是需要自己整理总结。由点到面,再到点,使后续总结复习时能清楚地找到重点和难点。
