美文网首页
Promise.all & Promise.allSettled

Promise.all & Promise.allSettled

作者: 捡了幸福的猪 | 来源:发表于2021-10-18 08:57 被阅读0次
    • Promise.all() 执行1-N个 promise 时,只要其中任何一个promise 失败都会执行 reject ,并且 reject 的是第一个抛出的错误信息,只有所有的 promise 都 resolve 时才会调用 .then 中的成功回调

    • 其中任意一个 promise 被 reject ,Promise.all 就会立即被 reject ,数组中其它未执行完的 promise 依然是在执行的, Promise.all 没有采取任何措施来取消它们的执行

    • Promise.allSettled() 可以获取数组中每个 promise 的结果,无论成功或失败

    • Promise.all()适合彼此相互依赖,其中任何一个被 reject ,其它都失去了实际价值

    • Promise.allSettled() 适合彼此不依赖,其中任何一个被 reject ,对其它都没有影响; 期望知道每个 promise 的执行结果

    • 当浏览器不支持 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
          // 如果传入的是一个空数组,那么就直接返回一个resolved的空数组promise对象
          if (len === 0) return resolve([])
          // 将传入的参数转化为数组,赋给args变量
          let args = Array.prototype.slice.call(promises)
          // 计算当前是否所有的 promise 执行完成,执行完毕则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~~ 今天开心了吗~~

    相关文章

      网友评论

          本文标题:Promise.all & Promise.allSettled

          本文链接:https://www.haomeiwen.com/subject/iaigoltx.html