首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >所有Node.js回调函数都是异步的吗?

所有Node.js回调函数都是异步的吗?
EN

Stack Overflow用户
提问于 2014-02-19 15:00:18
回答 3查看 4.4K关注 0票数 10

我正在学习Node.js,在每个教程中我听到的都是"Node是异步的,而不是-blocking!“

我听说在常规浏览器JavaScript中,只有某些东西,例如AJAX调用可以进行异步或非阻塞(使用回调).Node.js也是这样吗,还是所有的Node.js回调函数都是异步/非阻塞的?

EN

回答 3

Stack Overflow用户

发布于 2014-02-19 15:21:01

是否所有Node.js回调函数都是异步/非阻塞的?

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

异步函数示例:

  • 异步文件系统访问(但是它们有同步对应而没有回调)
  • 定时器(setTimeout)
  • process.nextTicksetImmediate
  • 大多数数据库连接
  • 网络连接
  • 应许

同步回调的示例:

还请参阅所有javascript回调都是异步的吗?如果没有,我怎么知道哪一个是? (包括其他一些示例)。

票数 17
EN

Stack Overflow用户

发布于 2014-02-19 15:20:19

当您将回调传递给函数时,您希望该函数在其他时间调用您的回调函数。但是,它并不是自动异步的。

假设我有以下代码:

代码语言:javascript
运行
复制
function callSomething(callback) {
  callback();
}

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

callSomething(theCallback);

在本例中,我们传递一个回调,但回调将立即在现有的调用堆栈上调用。这被认为是坏实践在Node.js中强烈反对。如果您想立即调用回调,请使用process.nextTick()

代码语言:javascript
运行
复制
function callSomething(callback) {
  process.nextTick(callback);
}

所以对你的问题的直接回答是肯定的。当在Node.js中指定对函数的回调时,按照约定,它们将在稍后的某个时间点在另一个回调堆栈上被调用。但是,如果您使用的是来自不知道如何遵循这一约定的人的一些坏代码,则无法保证。

票数 4
EN

Stack Overflow用户

发布于 2014-02-19 15:19:35

不,它们不是自动异步的。请考虑以下代码:

代码语言:javascript
运行
复制
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);
}

现在想象一下这样的程序:

代码语言:javascript
运行
复制
foo([ 1, 2, 3, 4 ], function() { while(true); }, console.log);
console.log('Blocking?');

如果foo是异步的,那么Blocking?就会立即出现,但它不会出现!

但是,您可以非常肯定,接受回调的大多数/所有标准库都是非阻塞异步代码。它的大部分也有一个Sync对应。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21884258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档