我正在尝试打破 promise ,因为我希望最终返回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' ]
我如何理解它是如何工作的:我的循环立即将一个新的 promise 附加到 myList
,然后当它解决时, promise 将被传递到 resolve
的字符串值替换。 .
它工作得很好,但我最终在开始时得到了 1 个未定义的值。我总共有 20 项,这是预期的,但其中一项是未定义的。这是为什么?
最佳答案
您推送到 myList
的 myPromise
是在 Promise 构造函数运行后创建的。因此,在第一次迭代中,myPromise
是未定义
(并且在后续迭代中,最后一个 myPromise
被推送到数组)。
构造 Promise,然后立即在同一迭代中推送到数组:
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
,情况可能会更清晰(以便您看到的代码更接近解释器的运行方式):
var myPromise;
var myList = [];
for (let i = 1; i <= 20; i++) {
myPromise = new Promise(function(resolve, reject) {
resolve("ITEM " + i);
});
myList.push(myPromise);
}
Promise.all(myList).then(function(values) {
console.log(values);
});
console.log("End");
关于JavaScript:Promise.all 结果中有 1 个未定义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55212948/