我正试图打破承诺,因为我想最终在myPromise
承诺内返回SQL查询的结果,因此我以许多SQL查询的结果列表结尾。
var myList = [];
for (let i = 1; i <= 20; i++) {
var myPromise = new Promise(function(resolve, reject) {
myList.push(myPromise);
resolve("ITEM " + i);
})
}
Promise.all(myList).then(function(values) {
console.log(values);
});
console.log("End");
输出:
[ undefined,
'ITEM 1',
'ITEM 2',
'ITEM 3',
'ITEM 4',
'ITEM 5',
'ITEM 6',
'ITEM 7',
'ITEM 8',
'ITEM 9',
'ITEM 10',
'ITEM 11',
'ITEM 12',
'ITEM 13',
'ITEM 14',
'ITEM 15',
'ITEM 16',
'ITEM 17',
'ITEM 18',
'ITEM 19' ]
我如何理解它的工作原理:我的循环立即向myList
附加了一个新的Promise,然后在解决该Promise时,将其替换为传递给{{1} }。
它运作良好,但是我在开始时得到1个未定义的值。我总共有20个项目,但其中一个未定义。为什么会这样?
答案 0 :(得分:3)
第一次将myPromise
推到myList
时仍未定义。
您可以通过完全避免使用myPromise
变量来解决此问题。
var myList = [];
for (let i = 1; i <= 20; i++) {
myList.push(new Promise(function(resolve, reject) {
resolve("ITEM " + i);
}))
}
或随后推送至myList
。
for (let i = 1; i <= 20; i++) {
var myPromise = new Promise(function(resolve, reject) {
resolve("ITEM " + i);
})
myList.push(myPromise);
}
答案 1 :(得分:3)
在Promise构造函数运行后 ,将创建您推送到myPromise
的{{1}}。因此,在第一次迭代中,myList
是myPromise
(在随后的迭代中,最后一个undefined
被推到数组中)。
构造Promise,然后立即在同一迭代中推送到数组:
myPromise
如果您手动提升var myList = [];
for (let i = 1; i <= 20; i++) {
var myPromise = new Promise(function(resolve, reject) {
resolve("ITEM " + i);
});
myList.push(myPromise);
}
Promise.all(myList).then(function(values) {
console.log(values);
});
console.log("End");
,可能会更清楚(这样一来,您可以看到代码更接近解释器的运行方式):
myPromise