首页 > 解决方案 > 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' ]

我如何理解它是如何工作的:我的循环立即将一个新的承诺附加myListresolve.

它工作得很好,但我在开始时得到了 1 个未定义的值。我总共有 20 个项目,这是预期的,但一个是未定义的。为什么是这样?

标签: javascriptasynchronouspromise

解决方案


第一次,您正在推动myPromisemyList仍然未定义。

您可以通过完全避免该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);
}

推荐阅读