1

我编写了下面的程序,以努力理解事件循环和 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();
4

2 回答 2

5

您在设置FL超时的代码中有一个错误。您的代码等效于:

/* ... */

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

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

/* ... */

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

  1. F“Outside all”不会首先执行,因为您正在调用L之前。
  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);
于 2013-06-14T07:28:24.597 回答
0

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

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

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

由于 setTimeout 函数不会将参数直接传递给您的函数,因此您需要将它们发送到后续参数中。

setTimeout(function,milliseconds,param1,param2,...)
于 2015-03-08T17:34:18.863 回答