我对NodeJS中async
的概念有疑问。我已经阅读了很多有关NodeJS中事件轮询的信息。他们说:
事件循环使Node.js能够执行非阻塞I / O 操作
或
节点使用工作池来处理“昂贵”的任务。这包括 操作系统不提供非阻止功能的I / O 版本,以及特别占用CPU的任务。
或
这些是使用此工作程序池的Node模块API,例如 作为文件系统(fs)
因此,我发现Node使用线程池管理运行的I / O。现在我的问题是,如果Node正在管理它们,为什么我们需要在NodeJS中完全利用async programming
?那么像 BlueBird 这样的模块背后的原因是什么?
答案 0 :(得分:2)
tl; dr::您需要async
来防止事件循环被阻止。
NodeJS使用一定数量的线程来处理客户端。基本上有两种类型的线程:
基本上需要异步编程的原因:
注册所有事件后,NodeJS进入事件循环并处理所有传入请求以及传出响应。它们全部通过事件循环。
您已经说过,NodeJS使用工作池执行I / O和CPU密集型任务。
为了防止阻塞主线程,您想保持事件循环的干净,并委派某些任务。这是需要异步代码的地方。这样,您的代码将成为非阻塞的。不过,关于异步和非阻塞的术语有点模糊。要澄清:
但是,在NodeJS中,异步通常用于I / O操作。在那里,它不仅仅意味着“并行执行”,因为它主要意味着“不要阻塞并获得信号”。
因此,为了使NodeJS的事件循环高效,我们不想等待操作完成。因此,我们改为注册一个异步“侦听器”。这使NodeJS可以有效地管理自己的资源。
BlueBird (或一般的承诺):
您不再需要像BlueBird这样的库,因为NodeJS支持开箱即用的承诺(请参见注释here)。
承诺只是编写异步代码的另一种方法。 Async/Await和Generator Functions也是如此。
旁注:用async
关键字定义的函数实际上产生了一个承诺。