JavaScript:Promise.all结果中有1个未定义的值

时间:2019-03-17 23:27:39

标签: javascript asynchronous 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' ]

我如何理解它的工作原理:我的循环立即向myList附加了一个新的Promise,然后在解决该Promise时,将其替换为传递给{{1} }。

它运作良好,但是我在开始时得到1个未定义的值。我总共有20个项目,但其中一个未定义。为什么会这样?

2 个答案:

答案 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}}。因此,在第一次迭代中,myListmyPromise(在随后的迭代中,最后一个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