javascript – 实现Promise.all

前端之家收集整理的这篇文章主要介绍了javascript – 实现Promise.all前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > JavaScript closure inside loops – simple practical example39个
Eloquent Javascript一书的第17章中的 exercises之一是实现Promise.all()方法,我想出了这个实现(这不起作用):
function all(promises) {
  return new Promise(function(success,fail) {
    var successArr = new Array(promises.length);
    if (promises.length == 0)
      success(successArr);
    var pending = promises.length;
    for (var i = 0; i < promises.length; i++) {
      promises[i].then(function(result) {
        successArr[i] = result;
        pending -= 1;
        if (pending == 0)
          success(successArr);
      },function(error) {
        fail(error);
      });
    }
  });
}


// Testing
function soon(val) {
  return new Promise(function(success) {
    setTimeout(function() { success(val); },Math.random() * 500);
  });
}
all([soon(1),soon(2),soon(3)]).then(function(array) {
  console.log("This should be [1,2,3]:",array);
});
// => [undefined,undefined,3]

有趣的是,除了在我的情况下使用forEach迭代promises数组而不是for循环之外,作者的解决方案是类似的:

function all(promises) {
  return new Promise(function(success,fail) {
    var successArr = new Array(promises.length);
    if (promises.length == 0)
      success(successArr);
    var pending = promises.length;
    promises.forEach(function(promise,i) {
      promise.then(function(result) {
        successArr[i] = result;
        pending -= 1;
        if (pending == 0)
          success(successArr);
      },function(error) {
        fail(error);
      });
    });
  });
}

// Testing
function soon(val) {
  return new Promise(function(success) {
    setTimeout(function() { success(val); },array);
});
// => [1,3]

为什么使用forEach在这里有所不同?,我猜它是与传递给forEach的匿名函数创建的范围相关的东西,但我无法弄清楚它是如何工作的.

解决方法

我只是想通了,它是i变量,因为我们处于for循环中,它在promise有机会解决之前发生变化但是在forEach版本中i变量是适当的范围所以每次迭代都有它自己的i变量
原文链接:https://www.f2er.com/js/158994.html

猜你在找的JavaScript相关文章