For the complete documentation index, see llms.txt. This page is also available as Markdown.

实现Promise.all

思路

  1. 传入的一定是数组

  2. Promise.resolve包裹(元素不是 Promise 对象,则使用 Promise.resolve 转成 Promise 对象

  3. 全部成功,返回resolve

  4. 只要有一个失败,返回reject

代码

function promiseAll(promises) {
  return new Promise(function(resolve, reject) {
    if (!isArray(promises)) {
      return reject(new TypeError('arguments must be an array'));
    }
    var resolvedCounter = 0;
    var promiseNum = promises.length;
    var resolvedValues = new Array(promiseNum);
    for (var i = 0; i < promiseNum; i++) {
      (function(i) {
        Promise.resolve(promises[i]).then(function(value) {
          resolvedCounter++
          resolvedValues[i] = value
          if (resolvedCounter == promiseNum) {
            return resolve(resolvedValues)
          }
        }, function(reason) {
          return reject(reason)
        })
      })(i)
    }
  })
}

最后更新于