JavaScript异步递归函数内的同步函数调用是否会阻塞?
JavaScript异步递归函数内的同步函数调用是否会阻塞?
当然会!咱们来一步步拆解你的代码执行流程,把这个问题说透:
首先要明确一个核心点:异步函数里的同步代码部分,和普通函数的同步代码没有任何区别——它们会完全阻塞后续代码的执行,必须等同步代码从头到尾跑完,才会继续处理后面的异步逻辑。
你的foo()是纯同步函数,所以在bar()里调用它的时候,JS会立刻执行foo()的所有代码,直到foo()执行完毕,才会往下走。具体到你的代码,执行顺序是这样的:
- 第一次调用
bar(),函数进入执行状态,首先执行foo(),瞬间打印出'is bar waiting for me to finish?',这一步没有任何异步等待,必须等foo()做完才会继续。 - 接下来遇到
await new Promise((r) => setTimeout(r, 10)):JS会创建这个Promise,把setTimeout的回调加入宏任务队列,然后暂停bar()的执行,把主线程的控制权交出去(如果此时有其他同步任务或宏任务,就会去处理它们)。 - 10毫秒后,
setTimeout的回调触发,Promise被resolve,bar()恢复执行,然后遇到await bar()——这时候又递归调用了bar(),于是重复上面的流程:先执行同步的foo()(再次阻塞,打印日志),然后再次进入await timeout的等待,循环往复。
说白了,await只会让异步函数在遇到它的位置暂停执行、交出线程,但await之前的所有同步代码,都会像普通函数一样按顺序同步执行,完全阻塞后续步骤。
你的代码示例:
function foo() { console.log('is bar waiting for me to finish?'); } async function bar() { foo(); // is this blocking? await new Promise((r) => setTimeout(r, 10)); await bar(); } bar();
备注:内容来源于stack exchange,提问作者justiceorjustus
相关产品推荐
相关产品推荐

