为什么Node.js中用字面义为异步的async配合await实现同步等待?
核心误区澄清
你首先需要纠正一个最常见的理解偏差:await 并没有把异步操作转为同步阻塞执行,它只是提供了类似同步代码的线性书写体验,底层完全遵循Node.js的异步非阻塞特性,不会卡死事件循环。
async 关键字的核心作用
async 的命名完全符合它的实际功能,它的核心作用只有一个:标记当前函数为异步函数,所有被async标记的函数,返回值永远是Promise对象:
async function getValue() { return 100; } console.log(getValue()) // 输出:Promise { 100 }
也就是说,async函数的执行本身就不会阻塞外层代码,它本身就是异步的,这也是它命名为async的根本原因。
await 到底在做什么
await 只能在async函数内部使用,它的作用是暂停当前async函数的后续代码执行,等待后方的Promise状态敲定后,再恢复执行后续代码。这个暂停只作用于当前async函数内部,完全不会影响Node.js事件循环处理其他任务、其他IO请求,和fs.readFileSync这类会阻塞整个进程的同步操作有本质区别。
举个很简单的例子就能看出来:
async function taskA() { await new Promise(resolve => setTimeout(resolve, 1000)) console.log('taskA执行完成') } async function taskB() { await new Promise(resolve => setTimeout(resolve, 1000)) console.log('taskB执行完成') } // 同时触发两个异步函数 taskA() taskB()
上述代码运行1秒后,两个日志会几乎同时打印,说明两个任务是并发执行的,并没有因为await变成同步阻塞。如果async/await真的是把逻辑转成同步,那么应该是先打印taskA的日志,再过1秒打印taskB的日志,显然和实际运行结果不符。
为什么不用sync命名
你感受到的「同步执行效果」只是语法糖带来的书写体验,本质逻辑还是完全异步的。如果用sync作为关键字名,反而会误导开发者认为这部分逻辑真的变成了同步阻塞代码,和实际行为完全相悖,反而会带来更多理解偏差。
内容的提问来源于stack exchange,提问作者Abhishek Gupta
相关产品推荐
相关产品推荐

