2014-04-04 65 views
0

我不知道如何使用setTimeout函數中的NodeJS。假設我想要:的NodeJS setTimeout函數

  1. 函數A()每10秒調用一次。
  2. 如果一個函數的從價值回調返回結果「真」,它會調用一個URL和DONE!
  3. 如果函數A keep返回值爲'false'的回調的結果,則保持呼叫,直到它收到'YES'達10分鐘
  4. 如果達到10分鐘最大值並且仍然沒有'true'結果,最後返回「假」

你怎麼做,在Node.js的請!

+1

Node.js的setTimeout的是完全一樣的普通瀏覽器的JavaScript的setTimeout。也許發佈你的示例代碼什麼不工作。 – rasmusx

+0

改爲查看setInterval,它允許您指定一個將每X秒調用一次的函數。要刪除它一旦你的功能完成後,保存到返回函數的引用和@adeneo我們可以使用clearInterval –

回答

0

簡單的例子(可能需要調整)

var timed_out = false, 
    timer  = setTimeout(function() { 
     timed_out = true; 
    }, (1000*60*10)); // ten minutes passed 


function A() { 
    call_func(function(result) { // call func with callback 
     if (result) { 
      clearTimeout(timer); 
      DONE(); 
     }else if (! timed_out) { 
      setTimeout(A, 10000); // call again in 10 seconds 
     } 
    }); 
} 
+0

感謝時,如果(結果),你如何清除setTimeout的阻止它? –

+0

@NamNguyen - 我真的不明白爲什麼你就必須清除任何超時的代碼,但我加了也無妨。 – adeneo

+0

我其實不知道我們是否必須清除它,以及最佳實踐是什麼。感謝您的回答,這非常有幫助。 –

0
var tenMinutes = false; // my boolean to test the 10 minutes 
setTimeout(function() { tenMinutes = true; }, 600000); // a timeout to set the boolean to true when the ten minutes are gone 

function A() { 
    $.ajax({ 
     url: "myURL", 
     method: "POST", 
     data: {}, 
     success: function(myBool) { 
      if (!myBool && !tenMinutes) { // if false, and not ten minutes yet, try again in ten seconds 
       setTimeout(A, 10000); 
      } 
      else if (!myBool && tenMinutes) { // else, if still false, but already passed ten minutes, calls the fail function (simulates the return false) 
       myFailresponse(); 
      } 
      else { // if the AJAX response is true, calls the success function (simulates the return true) 
       mySuccessResponse(); 
      } 
     } 
    }); 
} 

function mySuccessResponse() { 
    // you've got a "return true" from your AJAX, do stuff 
} 

function myFailResponse() { 
    // you've lots of "return false" from your AJAX for 10 minutes, do stuff 
} 

A(); // call the A function for the first time 
0

這裏的另一種方法。您可以使用setInterval定期調用該函數。如果你獲得成功,做成功的東西並取消計時器。否則,只需取消限制達到的時間。

function a(){ 
    console.log('a called'); 
    return false; 
} 

var doThing = (function() { 
    var start, 
     timeout, 
     delay = 1000, // 1 second for testing 
     limit = 10000; // 10 seconds for testing 
    return function() { 

     if (!start) { 
     start = new Date().getTime(); 
     timeout = setInterval(doThing, delay); 
     } 

     // Call a and tests return value 
     if (a()) { 

     // Do success stuff 

     // Set start to 0 so timer is cancelled 
     start = 0; 
     } 

     // stop timer if limit exceeded or start set to zero 
     if (new Date().getTime() > start + limit || !start) { 
     timeout && clearTimeout(timeout); 
     timeout = null; 
     start = null; 
     } 
    } 
}()); 

doThing();