[面试]手写题-Promise.all() Promise.race()
Promise.all()
接收一个Promise数组,数组中如有非Promise项,则此项当做成功
如果所有Promise都成功,则返回成功结果数组
如果有一个Promise失败,则返回这个失败结果
static all(promises) {const result = [];//创建一个空数组用于存储每个Promise的结果let count = 0;// 返回一个新的MyPromise实例return new MyPromise((resolve, reject) => {//将解析值存入结果数组并检查是否完成const addData = (index, value) => {result[index] = value;// 将值存入结果数组的对应位置count++;// 当所有Promise都完成时,if (count === promises.length) resolve(result)}// 遍历传入的Promise数组promises.forEach((promise, index) => {// 检查当前项是否是MyPromise实例if (promise instanceof MyPromise) {// 如果是Promise,等待其状态变更promise.then(res => {addData(index, res)}, err => {reject(err))})} else { // 非Promise值直接存入结果数组addData(index, promise)}})})
}
Promise.race()
接收一个Promise数组,数组中如有非Promise项,则此项当做成功
哪个Promise最快得到结果,就返回那个结果,无论成功失败
static race(promises) {// 返回一个新的MyPromise实例return new MyPromise((resolve, reject) => {// 遍历传入的Promise数组promises.forEach(promise => {// 检查当前项是否是MyPromise实例if (promise instanceof MyPromise) {promise.then(res => {resolve(res)}, err => {reject(err)})} else {resolve(promise)}})})
}
参考:
看了就会,手写Promise原理,最通俗易懂的版本!!!
09-手写Promise-Promise.all方法的实现