1.什么是Promise
Promise是异步编程的一种解决方案。
Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。(MDN) Promise在设计上具有原子性,即只有三种状态:等待(Pending)、成功(Fulfilled)、失败(Rejected)。这让我们在调用Promise的异步方法时,逻辑变得非常简单,这在大规模的软件工程开发中具有良好的健壮性。(实战es2015)2.基本语法
创建 Promise对象
new Promise( function(resolve, reject) {...} /* executor */ );
executor是带有 resolve 和 reject 两个参数的函数 。Promise构造函数执行时立即调用executor 函数, resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled,或者在发生错误时将它的状态改为rejected。
如果在executor函数中抛出一个错误,那么该promise 状态为rejected。executor函数的返回值被忽略。进行异步操作
- resolve(value) 方法控制的是Promise对象是否进入成功状态,一旦执行该方法并传入有且只有一个的返回值,Promise 便会从等待状态进入成功状态,Promise也不会再接收任何状态的改变。
- reject(reason) 方法控制的是Promise对象是否进入失败阶段,一旦进入失败状态就无法再改变。
- 一旦出现throw 语句,Promise对象便还会直接进入失败状态,并以throw语句的抛出值作为错误值进行错误处理。
let myFirstPromise = new Promise(function(resolve, reject){ //当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...) //在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法. setTimeout(function(){ resolve("成功!"); //代码正常执行! }, 250);});myFirstPromise.then(function(successMessage){ //successMessage的值是上面调用resolve(...)方法传入的值. //successMessage参数不一定非要是字符串类型,这里只是举个例子 console.log("Yay! " + successMessage);});
3.方法
Promise.all(iterable)
返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。
var promise1 = Promise.resolve(3);var promise2 = 42;var promise3 = new Promise(function(resolve, reject) { setTimeout(resolve, 100, 'foo');});Promise.all([promise1, promise2, promise3]).then(function(values) { console.log(values);}).catch(err=>err);
Promise.race(iterable)
返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promis就会解决或拒绝。
var promise1 = new Promise(function(resolve, reject) { setTimeout(resolve, 500, 'one');});var promise2 = new Promise(function(resolve, reject) { setTimeout(resolve, 100, 'two');});Promise.race([promise1, promise2]).then(function(value) { console.log(value); // Both resolve, but promise2 is faster});// expected output: "two"