簡體   English   中英

在 JavaScript / node.js 中的 for 循環中調用異步 function

[英]calling an async function inside for loop in JavaScript / node js

我想在 for 循環中調用異步 function

 function test(req,res){ //somelogic part here async function create(data){ //logic part here } for( var value in values){ // some codeing part here await create(data); } }
我收到這個錯誤

for await (var value in values)

然后我不能在 For 循環中調用異步 function。 我知道它是這樣寫的,但是有什么方法可以在 for 循環中調用異步 function

 for await (var value in values)

只需將async放在功能測試前面。

async function test(req, res) {…

如果你想await一個承諾,那么使用await的函數需要是async函數。

嗨,據我了解您的擔憂,我建議使用 .map() 函數,這在這種情況下非常有用。

async function create(data) {
   // Create user logic here
}
const usernames = ['test1', 'test2', 'test3'];
const createdUsers = usernames.map(async (val) => {
    const user = await create();
    return user;
});

await Promise.all(createdUsers);

如果只調用一個異步函數只是你的 for 循環的一部分意味着你可以簡單地將異步調用返回的承諾推送到一個數組,並使用承諾靜態方法,如“全部”

let pros= []
for(){
    pro.push(create(data));
}
Promise.all(pros).then(()=> {
    #implement rest or resolve another promise
})

請參考.. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

問題不在於您的create功能,而在於您的test功能。 調用await語法的范圍需要是async 因此,這里的范圍是test

只需將您的代碼更新為以下內容;

 /*vv --> async*/ async function test(req, res) { console.log("test is called"); async function create(to) { return new Promise((resolve) => { setTimeout(() => resolve(Date.now()), to); }); } const values = { a: 1e3, b: 2e3, c: 3e3 }; for (var value in values) { // some codeing part here const to = values[value]; const result = await create(to); console.log("result:", result); } return 1; } (async() => { const res = await test(); console.log("done"); })();

在另一個函數中包裝和創建新函數不是一個好主意。 您可以像下面的代碼一樣將函數創建移動到外部

 async function create(data){
 //logic part here
 }
 
async function test(req,res){
 //somelogic part here

 for( var value in values){
  // some codeing part here
  await create(data);
  }
}

或者改用箭頭函數

async function test(req,res){
 //somelogic part here
 const create = async (data) => {
 //logic part here
 }
 for( var value in values){
  // some codeing part here
  await create(data);
  }
}

您的問題有點令人困惑,因為似乎沒有任何理由async/await - create似乎沒有返回任何數據,因此aync/await似乎是多余的,您可能可以將其刪除。

但是,如果create確實返回了一個值,並且您想等到所有值都返回后再繼續,請創建一個函數調用數組,然后使用Promise.all等待從create返回的承諾已解決。

 // `create` returns a promise that resolves // after two seconds function create(data){ return new Promise((res, rej) => { setTimeout(() => res(data), 2000); }); } async function test(req,res) { const values = [1, 2, 3, 4]; // Create an array of promises const arr = values.map(el => create(el)); // And use Promise.all to wait to resolve them const output = await Promise.all(arr); console.log(output); } test();

如果將Promise放在for loop中,那么它將在每次迭代中獲得每個響應時間的總和。 所以我建議使用Promise.all

async func() {
    let arr = [];

    for(var value in values){
        arr.push(create(data));
    }

    let createdArr = await Promise.all(arr);

    // Using createdArr, you can get all waited responses
}

在這里它只會得到最多的響應時間,而不是總數。 所有Promises同時運行。

暫無
暫無

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

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