问题:Node 自诩异步编程是它的优势,为什么在引用外部包的时候(require()函数)是同步方法,而非异步方法
我的理解是,模块之间可能有依赖关系,同步能够保证加载的顺序。 请各位前辈,讲解一下(请无视我自己的理解o(╯□╰)o)
自己先顶一个
因为,这个地方如果改成异步,麻烦多于便利。异步的目的是什么?不是为了异步而异步。如果说 require 模块的话,模块都在本地,同步异步效率都很高啊。
支持:【不是为了异步而异步】
这个其实也应该加入到9 anti-patterns里面
@alsotang 不是为了异步而异步,这个很不错,但是还不足以全面解释这个问题,而且我不懂为什么模块在本地的话,同步比异步要快呢? 顺便说下,这个问题是我再知乎上看到的,是一道面试题目!
IO 只发生在第一次 require 的时候,所以在这里用同步应该还是可以接受的
- 麻烦。依赖次序保证需要用多次callback,嵌套太深
- 必要性不大。 2.1 要require的肯定都是本地文件 2.2 源代码文件通常也不大 2.3 也只装在一次。 因此耗时可控。
node的库里面唯有fs模块是同时有同步和异步api,而涉及到网络(肯定被硬盘慢),数据库(计算密集)都是异步的,根本没有提供同步的,可见文件,网络,数据库的压力级别根本不同。
同样是阻塞,也要分级,从cpu cache,RAM,DISK ,NETWORK ,有数量级的差别。
看图
@1000copy 这个解释很好的说 我之前稍微思考过这个LZ说的这个问题。require也要是异步?不过你的解释我个人觉得蛮到位的。
@1000copy 说的对 不过我觉得网络和数据库通信如果使用同步导致node.js线程阻塞的主要原因是,网络延时和其他服务器端负载等不可控制的原因,而非io、cpu、内存等压力。 就好像在浏览器端,用xhr同步方式请求http,也会导致js线程阻塞