所有的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.nextTick
,setImmediate
- 大多数数据库连接
- networking连接
- 承诺
同步callback的例子:
- EventEmitter (取决于事件何时被触发)
- 像
forEach
数组迭代方法 - 数组
sort
比较器callback - string
replace
匹配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
对应。