我正在学习 Node.js,我在每个教程中听到的都是“Node 是异步的,没有阻塞!”
我听说在常规浏览器 JavaScript 中,只有某些事情(例如 AJAX 调用)可以异步或非阻塞(使用回调)...... Node.js 也是如此,还是所有 Node.js 回调函数都异步/非阻塞?
我正在学习 Node.js,我在每个教程中听到的都是“Node 是异步的,没有阻塞!”
我听说在常规浏览器 JavaScript 中,只有某些事情(例如 AJAX 调用)可以异步或非阻塞(使用回调)...... Node.js 也是如此,还是所有 Node.js 回调函数都异步/非阻塞?
是否所有 Node.js 回调函数都是异步/非阻塞的?
不。只有 I/O 通常是异步的,但许多其他回调是同步的。始终检查文档。
异步函数示例:
同步回调示例:
forEachsort比较器回调replace匹配回调另请参阅所有 javascript 回调都是异步的吗?如果不是,我怎么知道哪些是?(包括一些其他示例)。
当您将回调传递给函数时,您希望该函数在其他时间调用您的回调函数。但是,它不会自动异步。
假设我有这个代码:
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 中指定回调函数时,按照约定,它们将在稍后的时间点在另一个调用堆栈上调用。但是,如果您使用的是不知道如何遵循此约定的人的一些不好的代码,则无法保证。
不,它们不是自动异步的。考虑这个代码:
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对应物。