2017-01-10 86 views
1

我不是说ES7的异步,而是像回调和promisses一般的异步函数。何时使用异步nodejs?

因此,我研究了关于NodeJS和事件循环的所有内容。一切都让我相信NodeJS有一种异步的错觉。

据我了解,这只有当功能必须通过外部媒体传递时才有效。例如,执行读取文件(将由OS API使用),或执行将使用外部API的请求。

我发现很少有人谈论它,我想在这里与你讨论这个问题。 我的问题是: 我对这个想法是否正确?而且,如果有实际的方法来找出异步工作在哪里,它不支付什么?在某些情况下,如果我是正确的,异步只会花费更多的内存。

+1

'所以,我研究了关于NodeJS和事件循环的所有内容。所有事情都让我相信NodeJS有一种异步的错觉 - 你需要再次学习 - 当你使用的函数是异步的时候,你会在nodejs中使用异步函数...你不能决定使用异步函数编写同步代码 - 当然,很多功能都有同步和异步版本,但在大多数情况下(超过50%),异步版本是首选 –

+0

所以,这就是为什么我问...大声笑 –

+0

我打算把'; - )'在“你需要重新学习之后” - 在面颊评论中是口舌,根本不意味着苛刻:p –

回答

1

Node.js异步工作,如果你在做一些阻塞I/O(比如使用fs .readFileSync()或其他同步函数)时,完整的node.js运行时进程将在该调用期间停止处理其他任何事情。因此,在web请求处理中,您不会调用同步函数(仅在node.js命令行应用程序中并在应用程序启动等)

这只是node.js的基本功能;其结果是,node.js/JavaScript没有,也不需要​​线程同步功能,例如。Java

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

如果您的处理不是由I/O事件触发的,则可以使用nodes.js timers创建人为事件。通常情况下,您认为这会使nodes.js不方便或不适合CPU限制的处理。

1

正好只有当函数必须通过外部介质时,这才有效。这是单线程异步事件循环的折衷。您应该避免在node.js中执行任何CPU绑定计算,因为它阻止了事件循环,因此不会回复任何回调。

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