所有的Node.jscallback函数都是asynchronous的吗?

我正在学习Node.js,我在每个教程中都听到的是“Node is asynchronous and no-blocking!”

我听说在常规的浏览器JavaScript只有某些东西,如AJAX调用可以做asynchronous或非阻塞(使用callback)…这是真的Node.js,或所有的Node.jscallback函数asynchronous/非阻塞?

所有的Node.jscallback函数都是asynchronous/非阻塞的?

不。只有I / O通常是asynchronous的,但许多其他callback是同步的。 总是检查文档。

asynchronous函数的例子:

  • asynchronous文件系统访问(虽然他们有没有callback同步同行)
  • 定时器( setTimeout
  • process.nextTicksetImmediate
  • 大多数数据库连接
  • networking连接
  • 承诺

同步callback的例子:

  • EventEmitter (取决于事件何时被触发)
  • forEach 数组迭代方法
  • 数组sort比较器callback
  • stringreplace匹配callback

另请参见是否所有的JavaScriptcallbackasynchronous? 如果没有,我怎么知道哪些是? (包括其他一些例子)。

当您将callback传递给某个函数时,您希望该函数可以在其他时间调用您的callback函数。 但是,它不是自动asynchronous的。

假设我有这样的代码:

 function callSomething(callback) { callback(); } function theCallback() { // Do something time consuming here } callSomething(theCallback); 

在这种情况下,我们传递一个callback函数,但是在现有的调用堆栈上立即调用callback函数。 这被认为是不好的做法 ,并强烈build议在Node.js中不鼓励 。 如果您想立即调用callback,请使用process.nextTick()

 function callSomething(callback) { process.nextTick(callback); } 

所以直接回答你的问题大多是肯定的。 当您在Node.js中为函数指定callback时,按照惯例,它们将在稍后的时间点在另一个调用堆栈上被调用。 但是如果你使用了一些不知道如何遵循这个约定的不好的代码,那就没有保证。

不,他们不会自动asynchronous。 考虑这个代码:

 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会asynchronous,那么Blocking? 会立即出现,但它不!


但是,您可以肯定的是,大部分/所有标准库进行callback都是非阻塞的asynchronous代码。 其中大部分还有一个Sync对应。