The Promise.all(arr).then
回调在数组完成之前执行,因此它不会捕获其元素。我怎样才能正确地做到这一点?
var arr = [];
for (var i = 0; i < 2; i++) {
arr.push((function() {
new Promise(function(resolve, reject) {
setTimeout(function() {
console.log("Resolved!");
resolve();
}, 3000);
});
})());
}
Promise.all(arr).then(function() {
console.log("Done");
});
我的预期结果是:
Resolved!
Resolved!
Done
但真实的结果是:
Done
Resolved!
Resolved!
上面的代码只是一个例子。我更改了如下结构,代码不再有问题,但我应该使用for
循环和push
因为我的应用程序结构。
var p1 = new Promise(function(resolve, reject) {
setTimeout(function() {
console.log("Resolved #1");
resolve();
}, 1000);
});
var p2 = new Promise(function(resolve, reject) {
setTimeout(function() {
console.log("Resolved #2");
resolve();
}, 2000);
});
var arr = [p1, p2];
Promise.all(arr).then(function() {
console.log("Done");
});
As 格奥尔格说 https://stackoverflow.com/questions/36616351/javascript-promise-and-promise-allarray-executed-before-array-fulfilled/36616458#comment60829165_36616351,你只是没有兑现承诺arr
,因为你永远不会从你包裹的匿名函数中返回任何东西new Promise
。该功能也是完全没有必要的,所以:
var arr = [];
for (var i = 0; i < 2; i++) {
arr.push(new Promise(function(resolve, reject) {
setTimeout(function() {
log('resolved !');
resolve();
}, 500);
}));
}
Promise.all(arr).then(function() {
log("Done");
});
function log(msg) {
var p = document.createElement('p');
p.appendChild(document.createTextNode(msg));
document.body.appendChild(p);
}
如果该函数存在,那么您可以捕获当时的值i
,只要确保你返回承诺:
var arr = [];
for (var i = 0; i < 2; i++) {
arr.push(function(index) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
log('resolved with ' + index + ' !');
resolve(index);
}, 500);
});
}(i));
}
Promise.all(arr).then(function() {
log("Done");
});
function log(msg) {
var p = document.createElement('p');
p.appendChild(document.createTextNode(msg));
document.body.appendChild(p);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)