2015-05-03 62 views
-3

我用setTimeout不止一次,除了這次我從來沒有發現任何問題。 (在函數refreshPhalanx中) 這裏是代碼: (我曾經用過創建一個在3000到3500毫秒之間的隨機延遲並將其存儲在var「msec」中,但是在使用3000後,爲了測試它,以防萬一在構建延遲時發生錯誤,但仍然沒有結果..)jQuery的setTimeout不尊重時間

var n=1; 
 
function refreshPhalanx(id){ 
 
    console.debug(id); 
 
    //$('.refreshPhalanxLink').click(); 
 
    if($('#'+id).length){ 
 
     console.debug('still going'+n++); 
 
     var msec=Math.floor((Math.random()/2+3)*1000) 
 
     console.debug(msec); 
 
     setTimeout(refreshPhalanx(id), 3000); //I used msec before, but I put 3000 to test if it was just a mistake into the calculation of the milliseconds, or a problem with setTimeout method. 
 
    } 
 
    else 
 
     alert('Alle ore '+new Date($.now())+' la missione risulta ritirata.');   
 
} 
 

 
function delay(){ 
 
    if($('.phalanx').length){ 
 
     console.debug('appending'); 
 
     $('.eventFleet').each(function(){ 
 
      $(this).append('<button currentevent="'+$(this).attr('id')+'" class="buttons">calcola rientro</button>'); 
 
     }) 
 
     console.debug('appending'); 
 
     $('.buttons').click(function(){ 
 
      console.debug('click --->'+ $(this).attr('currentEvent')); 
 
      refreshPhalanx($(this).attr('currentevent')); 
 
     }) 
 
     console.debug('appending'); 
 
    } 
 
    else{ 
 
     setTimeout(delay, 2000); 
 
     console.debug('delaying'); 
 
    } 
 
} 
 

 
delay();

+0

'的setTimeout(refreshPhalanx(ID),3000);'包含一個函數調用不是引用該函數。 – Xufox

+2

你覺得'refreshPhalanx(id)'做什麼?答:它調用函數。立即。它的*返回值*傳遞給'setTimeout'。 –

+1

'setTimeout'是**不是** jQuery,而是普通的vanilla DOM 0.請參閱[MDN](https://developer.mozilla.org/en/docs/Web/API/WindowTimers/setTimeout) – c69

回答

2

表達

setTimeout(refreshPhalanx(id), 3000); 

表示:調用函數refreshPhalanx(id)並將返回值設置爲第一個參數setTimeout

setTimeout的概要是function setTimeout(callback, milliseconds)其中callback是一個可調用的函數或一個函數名稱的字符串。

更改您的代碼

setTimeout(function() { 
     refreshPhalanx(id); 
}, 3000); 
+0

是的,我明白了。 。我很困惑的事實是,當我在過去使用這種方法時,我的函數沒有任何參數,我曾經只是把字符串..謝謝 – thestral

1

你需要傳遞function作爲第一個參數setTimeout。但與refreshPhalanx(id)你沒有通過函數,但返回值該函數在你的情況是undefined

要傳遞帶有參數的函數簡單包裝功能:

setTimeout(function(){ 
    refreshPhalanx(id) 
},3000); 

而且這最有可能是

setTimeout(delay, 2000); 

正常工作,因爲在這裏你剛剛通過了函數名,而不與執行它的情況下()

0

嘗試setTimeout()嵌套在你的電話在一個匿名的功能,例如:

setTimeout(function(){ 
    refreshPhalanx(id); 
}, 3000); 

setTimeout(function(){ 
    delay(); 
}, 2000); 
+1

延遲的調用正在工作,因爲它的延遲()但只是'延遲'。 –