当前位置: 首页 > 面试题库 >

nextTick vs set立即,直观的说明

谯阳伯
2023-03-14
问题内容

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

例子:

function log(n) { console.log(n); }

setImmediate

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

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。

资料来源:

  • 为什么setImmediate比nextTick慢得多?
  • setImmediate并不总是很即时

问题答案:

考虑以下两个示例:

setImmediate

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

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或计时器回调在平均时间中调用(与0ms超时的情况相同,它在第1次或第2次循环迭代中触发)。

但是,总是在执行完当前代码之后并返回事件循环之前立即触发nextTick回调。在nextTick示例中,在返回事件循环之前,我们最终执行了所有nextTick回调。由于将从事件循环中调用setTimeout的回调,因此直到完成每个nextTick回调后,才会输出文本“
TIMEOUT FIRED”。



 类似资料:
  • 本文向大家介绍举例说明js立即执行函数的写法有哪些?相关面试题,主要包含被问及举例说明js立即执行函数的写法有哪些?时的应答技巧和注意事项,需要的朋友参考一下 1、(function(){ //code }()) 2、!function(){ //code }() 3、!(function(){ //code })() 4、!(()=>{ //code })()

  • 编辑:下面是list_item_view.xml

  • 本文向大家介绍说一下乐观锁和悲观锁?相关面试题,主要包含被问及说一下乐观锁和悲观锁?时的应答技巧和注意事项,需要的朋友参考一下 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。 数据库的乐观锁需要自

  • 问题内容: 我偶然发现了这一点: 抛出一个。现在,我知道为什么会发生这种情况(在此作用域之后,是受约束的,因此在整个作用域中被认为是局部的)。 在这种情况下: 这很有道理。但是第一种情况具有直观的逻辑,这意味着: 我想这是有原因的,为什么不允许“直观”版本,但这是什么?尽管这可能是“显式比隐式更好”的情况,但总是对我摸索总是觉得不干净。 从一个角度来看,发生在我身上的实际情况是我不得不改变一下别人

  • 问题内容: 在一个简短的方法中,我使用setVisible(false)隐藏了一个JFrame。然后,截屏并使用setVisible(true)还原JFrame。 在再次显示之后,窗口应该显示与以前不同的图片(可以说是截图的一部分)。 问题是,在调用setVisible(true)之后,将窗口与旧内容一起闪烁一秒钟,然后再调用paintComponent并绘制更新的状态。 我可能会以丑陋的方式解决

  • 问题内容: 我正在尝试创建一些放置适当的说明性工具提示,用户可以单击这些提示以了解站点界面的工作方式。每个工具提示都有一个“下一个”链接,可通过修改类(因此更改为CSS)来切换上一个和下一个工具提示的可见性。 这是应该执行此操作的一些简化代码: 当我将此代码粘贴到控制台中时(或在页面加载时)立即调用(并正确切换类)。如果我将替换为,则按预期触发。我究竟做错了什么? 问题答案: 当您绑定事件时,您就