应好友邀请,手写一个promise.all方法记录下来
- 入参是个数组, 如一组axios请求,当然了,也可以传一些乱七八糟的来祸害祸害
- 返回值是个promise,因为可以使用.then
- 如果全部成功,状态变为resolved, 并且返回值组成一个数组传给回调
- 但凡有一个失败,状态变为rejected, 并将error返回给回调
function myPromiseAll(promises) { return new Promise((resolve, reject) => { if (!Array.isArray(promises)) { throw new TypeError("params must be an array") } let result = [] // 存放结果 let count = 0 // 记录有几个结果完成,当等于 promises.length时返回结果result for (let i = 0; i < promises.length;i++) { let promise = promises[i] // 期待的是promise,如果不是的话,直接把当前的值放到数组中 if (Object.prototype.toString.call(promise).indexOf('Promise') < 0) { result[i] = promise count++ count === promises.length && resolve(result) // 判断是否已经完成 continue } promise.then((res) => { result[index] = res count++ count === promises.length && resolve(result) // 判断是否已经完成 }).catch((err) => { reject(err) }) } }) } myPromiseAll([1,2 ,3 ,4 , 5]).then(res => { console.log(res) })