我试图打破承诺,因为我想最终在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时,将其替换为传递给resolve的字符串值。

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

最佳答案

您推送到myPromisemyList是在Promise构造函数运行之后创建的。因此,在第一次迭代中,myPromiseundefined(在随后的迭代中,最后一个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 - JavaScript:Promise.all结果中有1个未定义的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55212948/

10-10 13:00