2013-04-01 34 views
0

我想是的函數結果:測試一個條件是真還是假的javascript:等待使用的setInterval

調用一個函數check_and_wait()。它將繼續按設定的時間間隔檢查/循環一段指定的時間。

程序的其餘部分必須等待這個測試的結果。這是出錯的部分。它不必使用setInterval,這就是它現在如何實現的。

function test_condition(){ 
    // do some test. return true or false 
} 

function check_and_wait(){ 
    var maxtime = 3000; 
    var start = new Date().getTime(); 
    condition = false; 
    var interval = setInterval(function() { 
     if(condition){return true;} 
     else{ 
      if( new Date().getTime() - start < maxtime){ 
       condition = test_condition(); 
      } 
      else{return false;} 
     } 
    }, 250); 

} 

result = check_and_wait(); 
if(result){ 
    //do something 
} 
else{ 
    //do something else 
} 
+0

那是不可能的。你需要重構你的邏輯。的 –

+0

可能重複的[使用Javascript - 等待一函數結束](http://stackoverflow.com/questions/10311617/javascript-wait-a-function-to-finish) –

回答

2

如何使用回調,它是如此容易得多的工作與異步事件:

function check(finishCallback, waitingCallback) { 
    var maxtime = 3000; 
    var start = new Date().getTime(); 
    condition = false; 
    var interval = setInterval(function() { 
     if (condition) { 
      finishCallback(); 
     } 
     else { 
      if (new Date().getTime() - start < maxtime) { 
       condition = test_condition(); 
      } else { 
       waitingCallback(); 
      } 
     } 
    }, 250); 
} 

然後:

check(function() { 
    //do something 
}, function() { 
    //do something else 
}); 
+0

我希望避免這種嵌套代碼:功能嵌套函數內部的函數。如果我再次需要等待什麼呢?現在我所有的代碼都需要進入check()函數嗎?所以如果我需要等待其他東西,那麼這將是另一層嵌套? – user984003

+0

您無法在javascript中等待。這沒有意義。如果你有很多代碼(你正在調用的是*代碼的其餘部分),只需將它放在一個函數中,然後從相應的回調函數中調用該函數即可。如果你想做異步的javascript(比如AJAX,setInterval,...),你應該習慣於使用回調函數式編程。越早熟悉這種新的編碼風格,就越難忍受:-) –

+0

我知道我討厭javascript;我只是沒有意識到多少!我堅持使用js編碼PhantomJS。感謝您的回答。 – user984003

1

您可以使用一個回調將爆發病情變化時:

var interval; 
function check_and_wait(){ 
    var maxtime = 3000; 
    var start = new Date().getTime(); 
    condition = false; 
    interval = setInterval(function() { 
     if(!condition) 
      if( new Date().getTime() - start < maxtime){ 
       condition = test_condition(); 
      } 
     } 
     else { 
      callback(); 
     } 
    }, 250); 
} 

function callback() { 
    clearInterval(interval); 
    // do the stuff you do when you're ready 
} 
1

當你處理異步過程,你應該考慮使用回調函數。例如,在你的情況可能是:

function check_and_wait(callback) { 
    var maxtime = 3000; 
    var start = new Date().getTime(); 
    var interval = setInterval(function() { 
     if (new Date().getTime() - start < maxtime){ 
      if (test_condition()) { 
       clearInterval(interval); 
       callback(); 
      } 
     } 
    }, 250); 
} 

check_and_wait(function() { 
    // do something 
});