簡體   English   中英

使用 Promise.all 問題執行異步操作

[英]Perform async operations with Promise.all issue

我是 nodejs 的新手,對我來說 Promise 似乎有點難以理解。 我有一個要求,我有一個對象數組(假設來自數據庫的大數據)。 我需要通過每個數據 go 並為該特定數據並行執行兩個異步操作(數據庫操作)。

這是附加的示例片段。

const data = [
 {
     "id": 1
 },
 {
     "id": 2
 },
 {
     "id": 3
 },
 {
     "id": 4
 },
 {
     "id": 5
 }
];


(async () =>  {
    
    const first = async(id) => {
      // db operation  
      return new Promise(resolve => setTimeout(() => {
        console.log("first", id);
        resolve();
      }, 100 * Math.random()));
    };
    
    const second = async(id) => {
        // db operation
        return new Promise(resolve => setTimeout(() => {
        console.log("second", id);
        resolve();
      }, 100 * Math.random()));
    };
    
    const promiseResp = data.map(async(d) => {
        await first(d.id);
        await second(d.id);
    });
    
    await Promise.all(promiseResp);
})();

響應獲取:

first 5
first 3
second 5
first 4
first 2
first 1
second 3
second 2
second 4
second 1

我期望代碼針對相同的數據並行運行。 但回應並沒有像我期望的那樣。 我的期望是相同的 id,同時執行第一個和第二個異步操作,並在移動到下一個 object 之前提供 output。我們如何實現這一點?

有人可以讓我知道我失蹤的地方嗎? 任何幫助將非常感激?

編輯:另外,我們如何對所有數據執行並行操作?

要並行運行firstsecond ,您不會使用await而是

const promises = data.map(d =>
    Promise.all([
        first(d.id),
        second(d.id),
    ])
);
await Promise.all(promises);

在轉到下一個 object 之前提供 output

為此,您不能使用data.map ,而是使用順序循環await每個 object 的結果:

for (const d of data) {
    await Promise.all([
        first(d.id),
        second(d.id),
    ]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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