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