我正在玩承诺并发现约Promise.all()
如果我理解正确,它会在论证中的所有承诺得到解决后解决。我试过很少的代码
var x = ["one", "two"];
var g = 1000;
function take(element, sec) {
return new Promise(function(res, rej) {
setTimeout(function() {
res(element)
}, sec);
})
}
Promise.all(x.map(y => {
take(y, g);
g+=1000;
})).then(f => {
alert('done : ' + f);
})
但Promise.all立即解决了,这段代码中是否有任何错误,或者我对它的理解不好?
答案 0 :(得分:1)
由于torazaburo已经注意到map
回调中的return
语句丢失了。具有块语法的箭头函数需要显式g+=1000
。现在忽略以下作业map
。无论如何,依靠全球国家并不是一种好的做法。因此,我将表达式转换为var x = ["one", "two"];
function take(element, sec) {
return new Promise(function(res, rej) {
setTimeout(function() {
res(element)
}, sec);
})
}
Promise.all(x.map((y, i) => take(y, 1000*(i+1)))).then(f => alert('done : ' + f));
回调并使用不带块语法的箭头:
{{1}}
答案 1 :(得分:0)
正如已经说过多个地方一样,您需要从.map()
回调中返回承诺才能使Promise.all()
生效。这是一种简单的方法:
Promise.all(x.map(y => {
var p = take(y, g);
g+=1000;
return p;
})).then(f => {
alert('done : ' + f);
});
在此代码中,f
是一系列结果,因此您不清楚在alert()
中尝试做什么。