Promise.all()Promise.all()
方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。Promise.all()
方法接受一个数组做为参数,数组中若是有不是promise实例的状况,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。Promise.all()
方法的参数能够不是数组,但必须具备 Iterator 接口,且返回的每一个成员都是 Promise 实例。Promise.all()
返回值也是一个promise对象,当全部状态都变成fulfilled
,返回值的状态才会变成fulfilled
,当有一个promise实例的状态变成rejected
,此时第一个被reject
的实例的返回值,会传递给返回值的回调函数。数组
实现过程当中定义一个执行结果的数组,遍历all()
参数,若是是普通值,直接进入结果数组,若是是promise实例,就先执行,由于for循环有当即执行的特色,而咱们的promise实例有可能会有异步代码,向下传递执行结果的时候必需要保证咱们全部的实例执行完。传递结果以前要判断全部实例代码是否执行完。promise
static all(array) { let result = []; // 用于判断当前执行值是否等于数组长度,相等时才执行resolve() let idx = 0; return new MyPromise((resolve, reject) => { // 添加元素方法 function addElement(index, value) { result[index] = value; idx++; if (idx === array.length) { resolve(result) } } for (let i = 0; i < array.length; ++i) { let cur = array[i]; // 判断cur是不是普通值,普通值直接进入result数组, // promise对象就执行它,调用then方法,执行成功则添加到result数组,若是失败 if (cur instanceof MyPromise) { // promise对象 cur.then(value => addElement(i, value), reason => reject(reason)) } else { // 普通值 addElement(i, array[i]); } } }) }
promise.race()race()
方法相似,更加简单,遍历传入参数(数组对象),若是是普通值就调用resolve()
回调,若是是promise实例,执行then
方法异步
static race(array) { return new MyPromise((resolve, reject) => { for (let i = 0; i < array.length; ++i) { let cur = array[i]; if (cur instanceof MyPromise) { cur.then(resolve, reject); } else { resolve(cur) } } }) }
promise.resolve()
将现有对象转换为pomise对象,它的返回值就是一个promise对象。方便后面调用then
方法。实现它只须要稍做判断便可函数
static resolve(e) { if (e instanceof MyPromise) { return e; } else { return new MyPromise(resolve => resolve(e)) } }
Promise.prototype.finally()finally()
方法用于指定无论 Promise 对象最后状态如何,都会执行的操做。该方法是 ES2018 引入标准的。finally方法的回调函数不接受任何参数,不依赖于 Promise 的执行结果。函数体内执行then方法会返回一个promise对象,成功回调或者失败回调执行callback
便可,而且返回成功回调结果或者抛出失败异常,可是考虑到有异步代码的状况,借助resolve()
方法,在resolve方法中把callback
调用的结果传递出去,不管是普通值仍是promise都转成promise对象。以后就能够执行then方法。this
finally(callback) { return this.then(value => { return MyPromise.resolve(callback()).then(() => value); }, reason => { return MyPromise.resolve(callback()).then(() => { throw reason }) }) }
Promise.prototype.catch()Promise.prototype.catch()
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数。then()方法指定的回调函数,若是运行中抛出错误,也会被catch()方法捕获。
Promise 对象的错误具备“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误老是会被下一个catch
语句捕获。
跟传统的try/catch
代码块不一样的是,若是没有使用catch()
方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。
在catch方法中执行then
方法,第一次参数传入null
或者undefined
。第二个参数就是failCallback
prototype
catch (failCallback) { this.then(undefined, failCallback) }