簡體   English   中英

如何處理 javascript 中異步 function 內循環內的承諾?

[英]How do I handle promises inside loop inside async function in javascript?

async func(){
  try{
    let iter=[1,2,3]
    for (i of iter){
      let result=await someFunc()
      pool.query("some query",arrWithResult)
    }
  }catch(err){console.log(err)}
}

在這里,循環等待等待。 但我不想那樣。 我需要按順序執行結果和 sql 查詢,但循環應該繼續而不等待。 執行查詢時,我還需要當前 i 的值。 否則,我會將這些承諾推入數組並執行 Promise.all(arr)

async func(){
  try{
    let iter=[1,2,3]
    for (i of iter){
      someFunc().then(body=>{pool.query("some query",arrWithResult).catch(err=>err)
    }
  }catch(err){console.log(err)}
}

這個可以嗎? 我也想過讓 then 部分異步,但我應該添加另一個 try catch 塊嗎?

那么,什么是最好的方法呢? 或者我應該 go 用於 then/catch。 在做 Promise.all 時,iter 的值會丟失。

也許我想得不夠(或者你想得太多),但你為什么不只是重構為另一個異步 function 來完成循環的每次迭代需要做的事情,然后Promise.all()的列表返回承諾讓他們解決?

像這樣的東西:

async func f1() {
 const iter = [ 1, 2, 3 ] ;
 return await Promise.all( iter.map(f2) );
}

async func f2(i) {
 const result = await someFunc() ;
 return await pool.query( "some query" , arrWithResult );
}

來電者只需要說...

const responses = await f1();
```

不要為此使用迭代器變量 - 這是 Array.map() 的工作

Promise.all([1,2,3].map(i => someFunc().then(body => pool.query("some query",arrWithResult).catch(err=>err));

暫無
暫無

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

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