Воплощение Promise.all [дубликата]
На этот вопрос уже есть ответ:
JavaScript замыкание внутри циклов - простой практический пример 39 ответовОдин из Упражнения в главе 17 книги Eloquent Javascript, посвященной реализации метода 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, undefined, 3]
Интересно, что решение автора аналогично, за исключением использования forEach для перебора массива обещаний вместо цикла 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); },
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]
Почему использование forEach имеет здесь все значение? Я предполагаю, что это связано с областью действия, созданной анонимной функцией, переданной forEach, но я не могу понять, как это работает.