我发现很难获得JS回调概念。我了解这是一个等待其父级调用的函数网络,但这有什么好处? nodejs如何非阻塞?以下内容肯定会给您带来“ hello world”,还是第一个被称为“ hello world”? nodejs是否切换上下文,因为它将如何跳过等待被回调的函数?我知道这个问题组织得不好,因为我真的很困惑,有关更多信息,请评论。

SomeProccess(function() {
  print("hello");
});

OtherProccess(function() {
  print("world");
);

最佳答案

这完全取决于代码是阻塞的还是非阻塞的。

如果代码被阻止,则SomeProcess将执行某些操作,然后调用打印“ hello”的函数。如果它是非阻塞的,则意味着它要么将控制权传递给子进程,要么将消息传递到流中,然后在消息返回时再执行其他一些操作。

// Blocking
function SomeProcess(cb) {
    for (var i = 0; i < 10; i++) {
        ...
    }
    cb();
}

// Non blocking
function SomeProcess(cb) {
    process.nextTick(cb);
}


如果功能阻塞,那么您可以保证订单。如果没有阻碍,那就没有担保。

非阻塞:


process.nextTick
setTimeout / setInterval
child_process.spawn



在node.js中,您可以假定所有IO都是非阻塞的。 node.js内部有一个阻塞工作队列。 (调用函数),并且一旦完成该工作,它就会返回到事件循环并获取一组新的阻塞工作,即处理流中的传入消息或处理超时或处理process.nextTick事件。

需要注意的一件事是EventEmitter.emit正在阻止,它将立即解决所有绑定的事件处理程序。

09-30 13:55
查看更多