NodeJS 为什么我会得到Promise {< pending>}?[复制]

bfnvny8b  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(217)

此问题已在此处有答案

Getting an array of Promises after async await(1个答案)
9小时前关闭。
我是JavaScript和异步函数的新手。我试图在我的存储库中按ID查找一些项目。
我是这样打电话的

const foundedSectionsList = sections.map(async (sectionId) => {
 return await sectionsRepository.getSectionById(sectionId)
})

console.log(foundedSectionsList)

这就是我的结果:

[
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> }
]

为什么会这样?我确实在map函数上使用了async,而且我正在等待仓库的响应。
我尝试改变async和await的位置。

twh00eeo

twh00eeo1#

你在数组中得到promise是因为当你调用这些异步函数时,当你在map中传递它们时,它们不会等待结果的到来。Map将直接运行,无需等待上一次函数调用。
同样,这也不是在map内部调用异步函数的正确方法。正确的方法是使用Promise. all。
all()方法返回一个promise,当所有的输入promise都被解析时,这个promise就会被解析。返回的promise解析为输入promise的结果数组

const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('The first promise has resolved');
    resolve(10);
  }, 1 * 1000);
});
const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('The second promise has resolved');
    resolve(20);
  }, 2 * 1000);
});
const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('The third promise has resolved');
    resolve(30);
  }, 3 * 1000);
});

Promise.all([p1, p2, p3]).then((results) => {
  const total = results.reduce((p, c) => p + c);

  console.log(`Results: ${results}`);
  console.log(`Total: ${total}`);
});

输出如下所示:

The first promise has resolved 
The second promise has resolved 
The third promise has resolved 
Results: 10,20,30 Total: 60

当所有promise都已解析时,这些promise的值将作为数组传递到then()方法的回调中。之后将返回结果。
all()方法接受一个promise列表,并返回一个新promsie,如果所有输入promise都已解析,则该promsie解析为输入promise的结果数组;或者说,是第一个被拒绝的人。
您应该使用Promise.all()方法来聚合来自多个异步操作的结果。
我希望它能澄清你的疑问。干杯伙计!:)

相关问题