《深入理解ES6》之Promise
Promise相当于异步操作结果的占位符,他不会去订阅一个事件,也不会传递一个回调函数给目标函数,而是让函数返回一个Promise。
Promise的生命周期:pending(进行中)、fulfilled(完成)、rejected(拒绝)。
所有Promise都有then()方法,他接受两个参数:第一个是当Promise的状态变为fulfilled时要调用的函数,与异步操作相关的附加数据都会传递给这个完成函数;第二个是当Promise的状态变为rejected时要掉用的函数,与其完成时调用的函数类似,所有与失败状态相关的附加数据都会传递给这个拒绝函数。
let promise=readFile("example.txt"); promise.then(function(contents){ console.log(contents); },function(err){ console.log(err.message); }); promise.then(function(contents){ console.log(contents); }); promise.then(null,function(err){ console.log(err.message); });
Promise有一个catch()方法,相当于只给其传入拒绝处理程序的then()方法。then()方法与catch()方法一起使用才能更好的处理异步操作结果。
创建未完成的Promise
用Promise构造函数可以创建新的Promise,构造函数只接受一个参数:包含初始化Promise代码的执行器函数。执行器接受两个参数,分别是resolve()函数和reject()函数。执行器成功完成是调用resolve()函数,反之,失败时则调用reject()函数。
任务编排:当编排任务时,会向任务队列中添加一个新任务,并明确指定将任务延后执行。
let promise=new Promise(function(resolve,reject){ console.log("Promise"); resolve(); }); promise.then(function(){ console.log("Resolved"); }); console.log("jo");//先输出Promise,后输出jo,最后输出Resolved
完成处理程序和拒绝处理程序总是在执行器完成后被添加到任务队列的末尾。
创建已处理的Promise
Promise.resolve()方法只接受一个参数并返回一个完成态的Promise,也就是说不会有任务编排的过程,而且需要向Promise添加一至多个完成处理程序来获取值。
let promise=Promise.resolve(42); promise.then(function(value){ console.log(value); //42 });
Promise.reject()方法来创建已拒绝Promise,它创建出来的是拒绝态的Promise。
let promise=Promise.reject(42); promise.catch(function(value){ console.log(value); //42 });
Promise.resolve()方法和Promise.reject()都可以接受非Promise的Thenable对象作为参数。如果传入一个非Promise的Thenable对象,则这些方法会创建一个新的Promise,并在then()函数中被调用。拥有then()方法并且接受resolve和reject这两个参数的普通对象就是非Promise的Thenable对象。
let thenable={ then:function(resolve,reject){ resolve(42); } }; let p1=Promise.resolve(thenable); p1.then(function(value){ console.log(value); //42 });
let thenable={ then:function(resolve,reject){ reject(42); } }; let p1=Promise.resolve(thenable); p1.catch(function(value){ console.log(value); //42 });