首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nextTick对setImmediate的视觉解释

nextTick对setImmediate的视觉解释
EN

Stack Overflow用户
提问于 2013-07-06 12:24:12
回答 5查看 30.3K关注 0票数 94

我对nextTick和setImmediate之间的区别感到非常困惑。我在互联网上读过所有关于它们的文档,但我仍然不明白它们是如何工作的。

示例:

代码语言:javascript
复制
function log(n) { console.log(n); }

setImmediate

代码语言:javascript
复制
setImmediate(function() {
  setImmediate(function() {
    log(1);
    setImmediate(function() { log(2); });
    setImmediate(function() { log(3); });
  });
  setImmediate(function() {
    log(4);
    setImmediate(function() { log(5); });
    setImmediate(function() { log(6); });
  });
});

//1 2 3 4 5 6

nextTick

代码语言:javascript
复制
process.nextTick(function() {
  process.nextTick(function() {
    log(1);
    process.nextTick(function() { log(2); });
    process.nextTick(function() { log(3); });
  });
  process.nextTick(function() {
    log(4);
    process.nextTick(function() { log(5); });
    process.nextTick(function() { log(6); });
  });
});

//1 4 2 3 5 6

为什么会有这样的结果?请用视觉或很容易理解的解释来解释。即使是节点核心开发人员也不同意人们应该如何理解nextTick和setImmediate。

资料来源:

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-30 04:37:40

考虑以下两个例子:

setImmediate

代码语言:javascript
复制
setImmediate(function A() {
  setImmediate(function B() {
    log(1);
    setImmediate(function D() { log(2); });
    setImmediate(function E() { log(3); });
  });
  setImmediate(function C() {
    log(4);
    setImmediate(function F() { log(5); });
    setImmediate(function G() { log(6); });
  });
});

setTimeout(function timeout() {
  console.log('TIMEOUT FIRED');
}, 0)

// 'TIMEOUT FIRED' 1 4 2 3 5 6
// OR
// 1 'TIMEOUT FIRED' 4 2 3 5 6

nextTick

代码语言:javascript
复制
process.nextTick(function A() {
  process.nextTick(function B() {
    log(1);
    process.nextTick(function D() { log(2); });
    process.nextTick(function E() { log(3); });
  });
  process.nextTick(function C() {
    log(4);
    process.nextTick(function F() { log(5); });
    process.nextTick(function G() { log(6); });
  });
});

setTimeout(function timeout() {
  console.log('TIMEOUT FIRED');
}, 0)

// 1 4 2 3 5 6 'TIMEOUT FIRED'

setImmediate回调是从事件循环中触发的,每次迭代按排队顺序进行一次。因此,在事件循环的第一次迭代中,会触发回调A。然后在事件循环的第二次迭代中,触发回调B,然后在事件循环的第三次迭代中触发回调C等等。这将防止事件循环被阻塞,并允许同时调用其他I/O或计时器回调(例如在第1或第2循环迭代中触发的0ms超时)。

但是,nextTick回调总是在执行当前代码之后立即触发,然后再返回到事件循环。在nextTick示例中,在返回到事件循环之前,我们将执行所有nextTick回调。因为setTimeout的回调将从事件循环中调用,所以在每个nextTick回调完成之前,不会输出文本‘超时值触发’。

票数 107
EN

Stack Overflow用户

发布于 2016-08-03 11:49:55

根据Node.js文档,这两个函数的名称是准确交换

RECOMMENDED) setImmediate() (最佳)

在事件队列中先开火

on) ()( process.nextTick() )(用于特殊情况的,参见后面的示例)

立即开火,在当前文件末尾更多地写一份声明

如果我们有这个代码

代码语言:javascript
复制
setTimeout(function(){
  console.log('Hello world 5'); // It's waiting like a normal person at a queue
}, 0);

setImmediate(function(){
  console.log('Hello world 4'); 
  // It's like get to last and be take care of first 
  // but always after of .nextTick and before of setInterval(, 0)
});

process.nextTick(function(){
   console.log('Hello world 3'); // It's like be at the bottom at this file
});

console.log('Hello world 1');
console.log('Hello world 2');

根据您的请求提供直观的解释:

当您必须在处理process.nextTick()之前发出和事件时,使用它的情况如下:

代码语言:javascript
复制
const EventEmitter = require('events');
const util = require('util');

function MyEmitter() {
  EventEmitter.call(this);

  // use nextTick to emit the event once a handler is assigned
  process.nextTick(function () {
    this.emit('event');
  }.bind(this));
}
util.inherits(MyEmitter, EventEmitter);

const myEmitter = new MyEmitter();
myEmitter.on('event', function() {
  console.log('an event occurred!');
});

看看这个vide,菲利普·罗伯茨给我们提供了一个关于运行时事件循环的很好的解释,并查看了这个在线事件循环调试器实时测试事件循环的工作方式

来源:https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md#processnexttick-vs-setimmediate

票数 25
EN

Stack Overflow用户

发布于 2013-07-06 13:18:49

我不能为setImmediate复制你的结果。它应该与nextTick相同(在我的测试中也是如此),因为在这种情况下,它们所做的事情几乎是一样的。唯一合理的解释是,setImmediate在某种程度上是同步的,但它不是同步的。

根据NodeJS文档,唯一真正的区别是多个nextTick可能在一个循环迭代中触发(取决于maxTickDepth),而setImmediate每次迭代只触发一次。

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

https://stackoverflow.com/questions/17502948

复制
相关文章

相似问题

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