参见英文答案 >
JavaScript closure inside loops – simple practical example39个
Eloquent Javascript一书的第17章中的 exercises之一是实现Promise.all()方法,我想出了这个实现(这不起作用):
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变量