![](/img/trans.png)
[英]async/await concurrent function calls in javascript (Chain functions)
[英]How to iterate multiple async await functions and chain together in JavaScript?
我是JavaScript和Node.js的新手。 我有以下代碼:
const populateSetup = async () => {
token = await getToken();
const promises = await constant.accounts.map(async (x) => {
const accountId = await createAccountRequest(x.account);
const peoid = await createPeopleRequests(x.people);
const pid = await createProjectsRequests(x.project);
return [accountId, pid, peoid];
});
const [accountId, pid, peoid] = await Promise.all(promises);
};
在上面的代碼中,首先獲取令牌並創建帳戶需要令牌,然后需要返回的accountId來創建人員和項目。 假設我輸入以下內容:
exports.accounts = [
{ account: this.testAccountFirst, project: this.projectOne, people: this.testUserOne },
{ account: this.testAccountSecond, project: this.projectTwo, people: this.testUserTwo },
];
在節點環境中運行populateSetup()
,我的結果是(不是控制台輸出,而是populateSetup()
的輸出:
testAccountFirst has 1 people -> testUserOne
testAccountSecond has 2 projects and 1 user -> projectOne, projectTwo, testUserTwo
預期結果是:
testAccountFirst should have 1 project and 1 people -> projectOne, testUserOne
testAccountSecond should have 1 project and 1 people -> projectTwo, testUserTwo
這里的問題是第一個帳戶的accountId沒有發送到projectsRequest。 我不知道該如何解決。 我已經解決了這個Stackoverflow問題,但仍然無法弄清楚。
我很難理解您要問的是什么問題,但是.map()
並不精通異步。 這意味着即使您將回調聲明為async
, .map()
也不會對返回的承諾做任何事情,因此,它不會等到第一次迭代完成后才開始第二次迭代。 因此,最終您將並行運行循環的所有迭代中的所有異步操作,並且它們可以以任何隨機順序完成。
如果您真的想依次運行它們,則將.map()
切換到for
循環,因為for
循環將在循環的第一次迭代中await
,然后再開始循環的第二次迭代,因此上...
return [accountId, pid, peoid];
還返回已解決的承諾,您也要等一個承諾再解決。 例如,如果一個解析時間是5秒,那么您需要等待5 + 5 + 5 = 15秒
但是更多的是,在內部使用帶有保證的.map()
是不好的做法,因為它是同步運算符。 在您的情況下,我將使用類似的方法:
const populateSetup = async () => {
const token = await getToken();
const [accountId, peoid, pid] =[
createAccountRequest(x.account),
createPeopleRequests(x.people),
createProjectsRequests(x.project)
]
return Promise.all([accountId, peoid,pid])
};
在這里,您返回promise,可以像這樣使用:
const [accountId, peoid,pid] = await populateSetup()
Promise.all()
確實同時承諾執行並等待所有問題解決,所以它是5秒而不是15秒
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.