Javascript 履行承诺

Javascript 履行承诺,javascript,promise,Javascript,Promise,在《雄辩的Javascript》一书的第17章中,实现Promise.all()方法是一个重要的步骤,我提出了这个实现(它不起作用): 为什么使用forEach会有很大的不同?我猜这与传递给forEach的匿名函数所创建的作用域有关,但我不太清楚它是如何工作的。我刚刚弄明白,这是I变量,因为我们在for循环上,在promise有机会解决之前,它会发生变化,但在forEach版本中,i变量的作用域是正确的,因此每次迭代都有自己的ivariable是的!好的。这就是所谓的结束——我不认为你的书解释了

在《雄辩的Javascript》一书的第17章中,实现Promise.all()方法是一个重要的步骤,我提出了这个实现(它不起作用):


为什么使用forEach会有很大的不同?我猜这与传递给forEach的匿名函数所创建的作用域有关,但我不太清楚它是如何工作的。

我刚刚弄明白,这是
I
变量,因为我们在for循环上,在promise有机会解决之前,它会发生变化,但在forEach版本中,i变量的作用域是正确的,因此每次迭代都有自己的
i
variable

是的!好的。这就是所谓的结束——我不认为你的书解释了这一点,但你会非常了解它们。请参阅以获取解释。感谢链接;)@Bergi这个问题不是重复的,至少不是您标记为被重复的原始问题duplciated@AlexMills:怎么会这样?问题是异步回调中
i
变量的值,这正是规范的dupe目标所描述的。即使是OP的自我回答也表明了同样的观点。你会有什么不同的回答?
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, undefined, 3]
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); },
               Math.random() * 500);
  });
}
all([soon(1), soon(2), soon(3)]).then(function(array) {
  console.log("This should be [1, 2, 3]:", array);
});
// => [1, 2, 3]