当迭代调用不带 await 关键字的异步函数时,for 循环是否会阻塞? (调用的异步函数有 await 关键字)
Does the for loop block when the iteration invokes an async function without await keyword? (the invoked async function has the await keyword)
在下面的伪代码中,当 for 循环执行每次迭代时,for
循环会在每次迭代时阻塞等待异步 fetch
的响应(因为 await
在 myasyncfn
中使用?还是我需要使用 await
关键字,如下面的评论所示?
async myasyncfn(url){
return await fetch(url..).response;
}
for each url in url_array:
myasyncfn(url); #await myasyncfn(url)
在继续循环之前不会等待 async
函数完成;从这个意义上说,它 将 阻止。然而,这只是意味着它快速连续地遍历所有 URL,触发许多 fetch
请求,然后所有 运行 都在后台并行。一旦循环完成触发这些,您的线程就会畅通无阻。
举例说明:
async function foo(i) {
await new Promise(resolve => setTimeout(resolve, 5000));
console.log('Completed', i);
}
for (let i = 0; i < 10; i++) {
foo(i);
console.log('Fired', i);
}
console.log('Done firing all async functions, unblocking...');
在下面的伪代码中,当 for 循环执行每次迭代时,for
循环会在每次迭代时阻塞等待异步 fetch
的响应(因为 await
在 myasyncfn
中使用?还是我需要使用 await
关键字,如下面的评论所示?
async myasyncfn(url){
return await fetch(url..).response;
}
for each url in url_array:
myasyncfn(url); #await myasyncfn(url)
在继续循环之前不会等待 async
函数完成;从这个意义上说,它 将 阻止。然而,这只是意味着它快速连续地遍历所有 URL,触发许多 fetch
请求,然后所有 运行 都在后台并行。一旦循环完成触发这些,您的线程就会畅通无阻。
举例说明:
async function foo(i) {
await new Promise(resolve => setTimeout(resolve, 5000));
console.log('Completed', i);
}
for (let i = 0; i < 10; i++) {
foo(i);
console.log('Fired', i);
}
console.log('Done firing all async functions, unblocking...');