簡體   English   中英

如何在JavaScript中迭代多個異步等待函數並鏈接在一起?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM