【问题标题】:node.js and setTimeout and setInterval - understanding event loopnode.js 和 setTimeout 和 setInterval - 理解事件循环
【发布时间】:2013-06-14 06:20:35
【问题描述】:

我编写了下面的程序,以努力理解事件循环和 setTimeout 和 setInterval 等函数。

程序的输出与我的预期不同:

输出是:

In F
In L
Padalia
outside all
callback1
callback2
From Interval:0
From Interval:1
From Interval:2
From Interval:3

问题:

  1. 为什么不先执行“全部排除”?
  2. 为什么间隔总是最后执行?
  3. 谁能解释一下整个程序的执行过程。
  4. 退出程序前要等待一段时间,为什么?

程序:

var Fname = undefined;
var Lname = undefined;
var count = 0;

function F(callback){
  console.log("In F");
  Fname = "Rushabh";
  if(Fname != undefined && Lname != undefined) { 
    console.log(Fname);
    }      
  process.nextTick(function() { 
    callback();
  });
//callback();
}

function L(callback){
  console.log("In L");
  Lname = "Padalia";
  if(Fname != undefined && Lname != undefined) { 
    console.log(Lname);
  } 
  process.nextTick(function() {callback();});
//callback();
} 

function compute(){

  Id = setInterval(function() {
    console.log("From Interval:" + count); count++;
    if(count > 3){
      clearInterval(Id);
    }
  }, 100)

 setTimeout(F(function(){
  console.log("callback1");
 }),5000);

 setTimeout(L(function(){
  console.log("callback2");
 }) , 5000);

 console.log("Outside all");
}

compute();

【问题讨论】:

    标签: javascript node.js asynchronous settimeout event-loop


    【解决方案1】:

    您在设置FL 超时的代码中存在错误。你的代码相当于这个:

    /* ... */
    
    F(function(){
      console.log("callback1");
    });
    setTimeout(undefined ,5000);
    
    L(function(){
      console.log("callback2");
    });
    setTimeout(undefined, 5000);
    
    /* ... */
    

    现在应该清楚为什么您的程序没有按预期运行:

    1. “Outside all”没有首先执行,因为您之前调用了FL
    2. 由于同样的原因,间隔最后执行。
    3. 程序会等待 5 秒,等待您使用 undefined 回调设置的两个超时。

    修复代码的最简单方法是为setTimeout 调用添加匿名回调函数:

     setTimeout(function() { F(function(){
      console.log("callback1");
     })},5000);
    
     setTimeout(function() { L(function(){
      console.log("callback2");
     })} , 5000);
    

    或者,您可以使用bind 固定FL 参数(bind 的第一个参数是this 的值):

    setTimeout(F.bind(null, (function(){
     console.log("callback1");
    })),5000);
    
    setTimeout(L.bind(null, (function(){
     console.log("callback2");
    })) , 5000);
    

    【讨论】:

      【解决方案2】:

      您也可以按如下方式更改您的 setTimeout,

      ...
       setTimeout(F,5000,function(){
        console.log("callback1");
       });
      
       setTimeout(L,5000,function(){
        console.log("callback2");
       });
      ...
      

      由于 setTimeout 函数不会直接将参数带入您的函数,因此您需要在后续参数中发送它们。

      setTimeout(function,milliseconds,param1,param2,...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多