javascript - JavaScript:Promise.all 结果中有 1 个未定义值
问题描述
我试图打破承诺,因为我想最终在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
到resolve
.
它工作得很好,但我在开始时得到了 1 个未定义的值。我总共有 20 个项目,这是预期的,但一个是未定义的。为什么是这样?
解决方案
第一次,您正在推动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);
}
推荐阅读
- javascript - 如何仅使用 CSS3 将动态创建的元素平滑地添加到 DOM?
- c++ - C++:如何创建一个接受串联字符串作为参数的函数?
- c - C中优先级队列插入函数中的SIGSEV错误
- mongodb - Docker - 使用 MongoDB 创建第一个用户
- excel - Visual Studio Excel 插件 - VB.Net - 帮助避免不同数据范围的 vb.Null 错误
- laravel - 你如何处理喜欢许多不同的模型?
- macos - 如何使用流行图形日历创建 NSDatePicker?
- matlab - 组合循环中的 k-means 簇的结果
- javascript - 是否可以一次初始化 redux 存储并在多个页面中使用?
- php - 如何在 laravel 中自定义关联数组数据