我正在学习Node.js,在每个教程中我听到的都是"Node是异步的,而不是-blocking!“
我听说在常规浏览器JavaScript中,只有某些东西,例如AJAX调用可以进行异步或非阻塞(使用回调).Node.js也是这样吗,还是所有的Node.js回调函数都是异步/非阻塞的?
发布于 2014-02-19 15:21:01
是否所有Node.js回调函数都是异步/非阻塞的?
不是的。只有I/O通常是异步的,但许多其他回调是同步的。总是检查文档。
异步函数示例:
setTimeout
)process.nextTick
,setImmediate
同步回调的示例:
还请参阅所有javascript回调都是异步的吗?如果没有,我怎么知道哪一个是? (包括其他一些示例)。
发布于 2014-02-19 15:20:19
当您将回调传递给函数时,您希望该函数在其他时间调用您的回调函数。但是,它并不是自动异步的。
假设我有以下代码:
function callSomething(callback) {
callback();
}
function theCallback() {
// Do something time consuming here
}
callSomething(theCallback);
在本例中,我们传递一个回调,但回调将立即在现有的调用堆栈上调用。这被认为是坏实践,在Node.js中强烈反对。如果您想立即调用回调,请使用process.nextTick()
function callSomething(callback) {
process.nextTick(callback);
}
所以对你的问题的直接回答是肯定的。当在Node.js中指定对函数的回调时,按照约定,它们将在稍后的某个时间点在另一个回调堆栈上被调用。但是,如果您使用的是来自不知道如何遵循这一约定的人的一些坏代码,则无法保证。
发布于 2014-02-19 15:19:35
不,它们不是自动异步的。请考虑以下代码:
function foo(array, filter, callback) {
var result = []
for (var i = 0; i < array.length; i++) {
if (filter(array[i])) result.push(array[i]);
}
callback(result);
}
现在想象一下这样的程序:
foo([ 1, 2, 3, 4 ], function() { while(true); }, console.log);
console.log('Blocking?');
如果foo
是异步的,那么Blocking?
就会立即出现,但它不会出现!
但是,您可以非常肯定,接受回调的大多数/所有标准库都是非阻塞异步代码。它的大部分也有一个Sync
对应。
https://stackoverflow.com/questions/21884258
复制相似问题