function isPromise(obj) {
if (
!!obj
&& (typeof(obj) === 'object' || typeof(obj) === 'function')
&& typeof(obj.then) === 'function'
) {
return true
} else {
return false
}
}
function newPromiseAll(arr) {
let result = [];
return new Promise( (resolve,reject) => {
for(let i = 0; i < arr.length; i++){
if(isPromise(arr[i])){
arr[i].then(data => {
resolve(data)
}).catch (err => {
resolve(err)
})
} else {
result[i] = arr[i];
}
}
})
}
Promise.all 是所有的 Promise 都执行成功则返回结果,有一个失败就返回失败。
Promise.race 就像他的名字一样"竞赛",取跑得最快的那个 Promise,成功就 resolve,失败就 reject。
所以直接在循环的每个 Promise里的 then 和 catch 里取 resolve 或者 reject,去触发最外层的 Promise。