Javascript 异步方法中的Promise.all

Javascript 异步方法中的Promise.all,javascript,axios,Javascript,Axios,有一个我无法用承诺解决的问题。下面的代码在server.js中运行时,但我已经将包含网络调用的代码拆分为一个类,现在这个方法引起了问题 getItemDetails的行为类似于一个同步方法,在到达.then()之后,执行返回到server.js中的下一行,我不明白为什么会这样 类别: async getItemDetails(itemList) { let itemDetails = []; Promise.all(itemList.map(id => this.

有一个我无法用承诺解决的问题。下面的代码在server.js中运行时,但我已经将包含网络调用的代码拆分为一个类,现在这个方法引起了问题

getItemDetails的行为类似于一个同步方法,在到达.then()之后,执行返回到server.js中的下一行,我不明白为什么会这样

类别:

async getItemDetails(itemList) {

    let itemDetails = [];    
    Promise.all(itemList.map(id => this.axios.get(`/api/Item/${id.ItemID}/details`)))
        .then(responses => {
            responses.forEach(
                response => itemDetails.push(response.data)
            )
        })
        .then(() => {
            return itemDetails;
        })
        .catch(error => {
            console.error(error);
        });
}
server.js

(async () => {

    let itemList = await getItems() // Calls API to get a list of Items

    let detailList = await getItemDetails(itemList); // Retrieve details for hundreds of items


})();

编辑:删除了我的代码示例,另一个答案的实现要好得多

JavaScript在异步之前处理同步代码,需要解决承诺问题
async/await
允许编写更少的嵌套代码,尽管值得记住:承诺仍然需要解决/拒绝

或者,使用
async/await
并使用更同步的样式重新编写它(当然,使用await作为承诺)


否则,JavaScript将查看该方法,查看它有异步工作要做,完成同步代码并完成执行
。然后()
,当然,这是在该方法完成之后。

编辑:删除了我的代码示例,另一个答案的实现要好得多

JavaScript在异步之前处理同步代码,需要解决承诺问题
async/await
允许编写更少的嵌套代码,尽管值得记住:承诺仍然需要解决/拒绝

或者,使用
async/await
并使用更同步的样式重新编写它(当然,使用await作为承诺)


否则,JavaScript将查看该方法,查看它有异步工作要做,完成同步代码并完成执行
。然后()
,当然,这是在该方法完成之后。

您使用的是异步函数,因此不要使用
.then().catch()所有:
async
wait
都是围绕承诺的语法糖,旨在消除then/then/then/catch/then/catch/etc链接的问题。相反,您编写的代码基本上是香草JS,除了在承诺/异步调用之前的战术
wait

async getItemDetails(itemList) {
  const items = await Promise.all(
    itemList.map(id =>
      this.axios.get(`/api/Item/${id.ItemID}/details`)
    )
  );

  return items.map(response => response.data);
}
或者,如果您确实想在Promissions中显式执行所有操作,请删除
async
关键字,因为这样您就不需要它了:

getItemDetails(itemList) {
 return new Promise((resolve, reject) => {
  Promise.all(
    itemList.map(id =>
      this.axios.get(`/api/Item/${id.ItemID}/details`)
    )
  )
  .then(responses => resolve(responses.map(r => r.data))
  .catch(err => reject(err));
}

请注意,就调用方所知,这些函数是相同的,产生相同的结果:
async
函数返回承诺,
wait
只是将承诺解析为值的简写代码。

您使用的是异步函数,因此不要使用
.then().catch()所有:
async
wait
都是围绕承诺的语法糖,旨在消除then/then/then/catch/then/catch/etc链接的问题。相反,您编写的代码基本上是香草JS,除了在承诺/异步调用之前的战术
wait

async getItemDetails(itemList) {
  const items = await Promise.all(
    itemList.map(id =>
      this.axios.get(`/api/Item/${id.ItemID}/details`)
    )
  );

  return items.map(response => response.data);
}
或者,如果您确实想在Promissions中显式执行所有操作,请删除
async
关键字,因为这样您就不需要它了:

getItemDetails(itemList) {
 return new Promise((resolve, reject) => {
  Promise.all(
    itemList.map(id =>
      this.axios.get(`/api/Item/${id.ItemID}/details`)
    )
  )
  .then(responses => resolve(responses.map(r => r.data))
  .catch(err => reject(err));
}
请注意,就调用方所知,这些函数是相同的,产生相同的结果:
async
函数返回承诺,
wait
只是将承诺解析为值的简写代码