2015-11-30 113 views
0

我对Node.js有点新,并且困惑我如何完成我的目标。当返回true/false时Node.js停止函数

我有这样的功能:

function Timer() { 
     setTimeout(function() { 
      finish(); 
      return true; 
     }, 60000); 

     setInterval(function() { 
      if (fail()) { 
       return false; 
      } 
     }, 5000); 
} 

该功能获取的调用一次,应该停止它里面有返回功能的时候之一。功能fail()基本上只是掷骰子,并有机会返回5%的false

功能finish()正在返回true超时结束。

一旦它返回某个地方,我该如何彻底退出我的功能?

+0

你想写什么逻辑?骰子? – Ben

回答

2

使用一个变量来存储间隔和超时,这样您就可以使用clearInterval/clearTimeout当你end功能满足您的所需条件(或超时完成),你应该传递一个回调到您Timer功能,所以你能够返回一次的时间间隔或超时完成值:

function Timer(myCallback) { 
    var myInterval, myTimeout; 
    myTimeout = setTimeout(function() { 
     finish(); 
     clearInterval(myInterval); //Clear the interval so that the callback won't be called again. 
     myCallback(true); //Call your callback function passing true. 
    }, 60000); 

    myInterval = setInterval(function() { 
     if (fail()) { 
      clearInterval(myInterval); //Clear the interval so that the callback won't be called again. 
      clearTimeout(myTimeout); //Clear the timeout so that the callback won't be called again. 
      myCallback(false); //Call your callback function passing false. 
     } 
    }, 5000); 
} 

现在你的回调将得到真/假取决于哪一个被先叫。

Timer(function(condition) { 
    if (condition) doSomethingWhenConditionIsTrue(); 
    else doSomethingWhenConditionIsFalse(); 
}); 
0

你的功能是异步的,这意味着setTimeoutsetInterval后退出,没有返回值。在JavaScript中,函数被设计为异步的,它们不能停止主线程。

0

JavaScript使用run-to-completion执行模型,并且setTimeoutsetInterval是异步的。这意味着你将不得不在稍后调用函数中提供继续逻辑。你有三个选择:

  1. 回调
  2. 承诺
  3. 协同程序(仅当你是一个现代化的运行时)

请说明您预期的逻辑,我会加入到这个答案。