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

标签 javascript asynchronous promise

我正在尝试打破 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 项,这是预期的,但其中一项是未定义的。这是为什么?

最佳答案

您推送到 myListmyPromise 是在 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/

相关文章:

iphone - 异步使用 NSURLConnection 没有返回数据

c# - 处理泄漏的 IAsyncDisposable 实例的推荐方法是什么?

Javascript Promise 和异步代码

javascript - 更改键后如何移动数组中的对象

javascript - 在 JavaScript 中删除对象

javascript - Rxjs 在顺序执行操作时出现 concat 运算符问题

javascript - 异步函数返回 Promise { <pending> }?

javascript - 状态不会在 setInterval 内更新

c# - 等待任务不适用于 IEnumerable

javascript - 我如何处理两级嵌套 promise 的结果?