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