2013-06-14 3 views
1

Я написал программу ниже, чтобы понять цикл событий и функции, такие как setTimeout и setInterval.node.js и 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(); 

ответ

5

У Вас есть ошибка в коде, где вы установили F и L таймаут. Ваш код эквивалентен следующему:

/* ... */ 

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

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

/* ... */ 

Теперь должно быть ясно, почему ваша программа не ведет себя так, как вы ожидали:

  1. «Вне всех» не выполняется первым, потому что вы звоните F и L раньше.
  2. Интервал выполнен последним по той же причине.
  3. Программа ждет 5 секунд для двух таймаутов, которые вы установили с обратным вызовом undefined.

Самый простой способ, как исправить код, чтобы добавить анонимную функцию обратного вызова для setTimeout вызовов:

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

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

В качестве альтернативы, вы можете использовать bind зацикливается F и L параметров (первый параметр bind является значение для this):

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

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

Вы также можете изменить SetTimeout следующим образом,

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

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

Поскольку функция setTimeout не принимает параметр непосредственно к вашей функции, вам необходимо отправить их в последующие параметры.

setTimeout(function,milliseconds,param1,param2,...) 
Смежные вопросы