我发现很难获得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
正在阻止,它将立即解决所有绑定的事件处理程序。