何时使用异步 nodejs?

Posted

技术标签:

【中文标题】何时使用异步 nodejs?【英文标题】:When to use async nodejs? 【发布时间】:2017-05-24 09:11:48 【问题描述】:

我不是说 ES7 的异步,而是一般的异步函数,例如回调和承诺。

所以,对于我研究过的所有关于 NodeJS 和事件循环的知识。一切都让我相信 NodeJS 对异步有一种错误的感觉。

据我了解,这仅在必须通过外部介质传递函数时才有效。例如,执行一个读取文件(将由 OS API 使用),或者执行一个也将使用外部 API 的请求。

我发现很少有人谈论它,我想在这里与您讨论这个问题。 我的问题是: 我的想法是对的吗?还有,是否有实用的方法来找出异步在哪里工作以及在哪里不支付?在某些情况下,如果我是正确的,异步只会消耗更多的内存。

【问题讨论】:

So, for all I studied about NodeJS and event loop. Everything leads me to believe that NodeJS has a false sense of async - 那你需要再次学习 - 当一个使用的函数是异步时,一个在 nodejs 中使用异步函数......你不能决定使用异步函数编写同步代码 - 当然,许多函数都有同步和异步版本,但在大多数情况下(超过 50%),首选异步版本 所以,这就是我问的原因……哈哈 我的意思是在“你需要再次学习”之后加上一个;-) - 是开玩笑的评论,一点也不苛刻:p 我的意思是,只有当异步函数将在另一个位置执行操作时,节点才能与异步正常工作。作为 libuv。我想知道我这样想是否正确?我看到很多使用异步的人对所有事情都发疯了,也许只要它创建回调并承诺节点将无法运行该异步并会阻塞。 nodesource.com/blog/understanding-the-nodejs-event-loop 【参考方案1】:

Node.js 总是异步工作。如果您正在执行一些阻塞 I/O(例如使用 fs.readFileSync() 或其他同步函数),则完整的 node.js 运行时进程会在该调用期间停止处理任何其他内容。因此,在 Web 请求处理中,您从不调用同步函数(仅在 node.js 命令行应用程序和应用程序启动等过程中可接受)

这只是node.js的一个基本特性;其结果是 node.js/javascript 没有也不需要 synchronized 线程同步功能,例如。 Java。

从技术上讲,运行中的多线程 node.js 进程中唯一的地方是内部 libuv 库,并且仅用于补偿主机系统缺少的异步 I/O。

如果您的处理不是由 I/O 事件触发,您可以使用 nodes.js timers 创建人工事件。您可以正确地假设,一般而言,这会使 node.js 不方便或完全不适合 CPU 密集型处理。

【讨论】:

【参考方案2】:

确实只有在函数必须通过外部介质传递时才能正常工作。这是与单线程异步事件循环的权衡。您应该避免在 node.js 中进行任何 CPU 绑定计算,因为它会阻塞事件循环,因此无法响应回调。

node 仅在 OS IO 调用时产生,在使用回调或 Promise 时不会产生。这是处理基于 IO 的调用的两种方法,但它们本身并不是异步的。 (我见过很多项目,人们为同步代码创建基于回调的 API :()

【讨论】:

以上是关于何时使用异步 nodejs?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 测试 - 异步函数调用 - 何时使用

角度-知道模板渲染何时完成-使用异步管道

Vue 检查异步组件何时加载

setState何时同步,何时异步,为什么?

检查多个异步网络操作何时完成

何时使用 Spring @Async vs Callable 控制器(异步控制器,servlet 3)