动手实现 ES6 中的 Promise
动手实现 ES6 中的 Promise

动手实现 ES6 中的 Promise

在异步编程中,Promise 扮演了举足轻重的角色,它解决了 ajax 请求过程中的回调地狱的问题,令代码更具可读性。

实现Promise.all

Promise.all 方法接受一个 promise 的 iterable 类型的输入,并且只返回一个 Pormise 实例,那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个 Promise 的 resolve 回调执行是在所有输入的 promise 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。

const PromiseAll = (values) => {
  let resolutions = [];
  if (!Array.isArray(values)) {
    reject(new TypeError("invalid_argument"));
  }
  return new Promise((resolve, reject) => {
    try {
      let count = values.length;
      if (count === 0) {
        resolve(resolutions);
      } else {
        for (let i = 0; i < values.length; i++) {
          Promise.resolve(values[i]).then(
            // 注:如果用var实现需要对下面的function使用闭包记录循环内的i值
            // (function(){var i_captured=i; return function(x){ resolutions[i_captured] = x; if(--count===0){resolve(resolutions)}}})()
            (x) => {
              resolutions[i] = x;
              if (--count === 0) {
                resolve(resolutions);
              }
            },
            (r) => {
              reject(reject);
            }
          );
        }
      }
    } catch (e) {
      reject(e);
    }
  });
};

发表评论

邮箱地址不会被公开。