Promise.all & Promise.allSettled

  • Promise.all() 執(zhí)行1-N個 promise 時,只要其中任何一個promise 失敗都會執(zhí)行 reject ,并且 reject 的是第一個拋出的錯誤信息,只有所有的 promise 都 resolve 時才會調(diào)用 .then 中的成功回調(diào)

  • 其中任意一個 promise 被 reject ,Promise.all 就會立即被 reject ,數(shù)組中其它未執(zhí)行完的 promise 依然是在執(zhí)行的, Promise.all 沒有采取任何措施來取消它們的執(zhí)行

  • Promise.allSettled() 可以獲取數(shù)組中每個 promise 的結(jié)果,無論成功或失敗

  • Promise.all()適合彼此相互依賴,其中任何一個被 reject ,其它都失去了實(shí)際價(jià)值

  • Promise.allSettled() 適合彼此不依賴,其中任何一個被 reject ,對其它都沒有影響; 期望知道每個 promise 的執(zhí)行結(jié)果

  • 當(dāng)瀏覽器不支持 Promise.allSettled , polyfill:

if (!Promise.allSettled) {
  const rejectHandler = reason => ({status: "rejected", reason})
  const resolveHandler = value => ({status: "fulfilled", value})
  Promise.allSettled = promises =>
    Promise.all(
      promises.map((promise) =>
        Promise.resolve(promise) 
          .then(resolveHandler, rejectHandler)
      )
      // 每個 promise 需要用 Promise.resolve 包裹下
      // 以防傳遞非 promise
    );
}

// 使用
const p1 = Promise.resolve(1)
const p2 = Promise.resolve(2)
const p3 = new Promise((resolve, reject) => {
  setTimeout(reject, 1000, 'three');
})
const promises = [p1, p2, p3]
Promise.allSettled(promises).then(console.log)
  • Promise.all 源碼
function promiseAll(promises){
     return new Promise(function(resolve,reject){
            if(!Array.isArray(promises)){
             return reject(new TypeError("argument must be anarray"))
           }
    var countNum=0;
    var promiseNum=promises.length;
    var resolvedvalue=new Array(promiseNum);
    for(var i=0;i<promiseNum;i++){
      (function(i){
         Promise.resolve(promises[i]).then(function(value){
            countNum++;
           resolvedvalue[i]=value;
          if(countNum===promiseNum){
              return resolve(resolvedvalue)
          }
       },function(reason){
        return reject(reason)
      )
     })(i)
    }
})
}
var p1=Promise.resolve(1),
p2=Promise.resolve(2),
p3=Promise.resolve(3);
promiseAll([p1,p2,p3]).then(function(value){
console.log(value)
})
  • Promise.allSettled 源碼
MyPromise.allSettled = function (promises) {
    return new MyPromise((resolve, reject) => {
      promises = Array.isArray(promises) ? promises : []
      let len = promises.length
      const argslen = len
      // 如果傳入的是一個空數(shù)組,那么就直接返回一個resolved的空數(shù)組promise對象
      if (len === 0) return resolve([])
      // 將傳入的參數(shù)轉(zhuǎn)化為數(shù)組,賦給args變量
      let args = Array.prototype.slice.call(promises)
      // 計(jì)算當(dāng)前是否所有的 promise 執(zhí)行完成,執(zhí)行完畢則resolve
      const compute = () => {
        if(--len === 0) { 
          resolve(args)
        }
      }
      function resolvePromise(index, value) {
        // 判斷傳入的是否是 promise 類型
        if(value instanceof MyPromise) { 
          const then = value.then
          then.call(value, function(val) {
            args[index] = { status: 'fulfilled', value: val}
            compute()
          }, function(e) {
            args[index] = { status: 'rejected', reason: e }
            compute()
          })
        } else {
          args[index] = { status: 'fulfilled', value: value}
          compute()
        }
      }
   
      for(let i = 0; i < argslen; i++){
        resolvePromise(i, args[i])
      }
    })
  }

hi~~ 今天開心了嗎~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容