2012-09-13 53 views
0

我試圖循環一些值,這是毫秒。我需要每隔xxxx秒運行一些代碼,具體取決於他從循環中獲得的值,但是我無法讓它正常工作,它工作正常,但不能按時運行。每個循環中的settimeout有問題

的代碼包含一個復位按鈕(代碼是從一個插件,但我不得不修改)

//插件選項

step:[ 
     { 
      time: 6000, 
      // more stuff here 
      // but we dont need 
      // it in this example 
     }, 
     { 
      time: 3000, 
      // more stuff here 
      // but we dont need 
      // it in this example 
     }, 
     { 
      time: 12000, 
      // more stuff here 
      // but we dont need 
      // it in this example 
     } 
    ] 

//循環

var timeouts = []; 
    $.each(options.step, function(i, value){ 

     var time = value.time;              
     timeouts.push(setTimeout(function(){ 

      alert('some action'); 

     },time*i)); 

    }); 

//復位按鈕

$('.stop').click(function(){ 
     $.each(timeouts, function (_, id) { 
      clearTimeout(id); 
     }); 
     timeouts = []; 
    }) 

回答

0

我的主要猜測是你沒有設置所需的定時器時間。您正在使用i * value.time作爲您的計時器時間,這看起來很奇怪。你知道i是你的陣列的索引,所以第一次它將爲零,然後是1,然後是2等等......

這將導致計時器時間爲:0*6000, 1*3000, 2*12000,其轉換爲0, 3000, 24000

這看起來不像你想要的。

另外,瀏覽器中的Javascript是單線程的(除了webWorkers和一些事件副作用,我們這裏沒有討論這個)。因此,setTimeout()不保證準確。如果其他事件在定時器事件觸發時運行,則該定時器事件進入事件隊列,稍後當Javascript執行的當前線程結束時運行。因此,setTimeout()將不會按時運行,如果有其他事情在其發生時正在運行。

+0

並不完全正確。 HTTP://計算器。com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded –

+0

@BlakeRegalia - 這篇文章與這個上下文或OP的問題無關(例如'setTimeout()'的時間)。 – jfriend00

+0

只是說,不要在不承認角落案例的情況下就JavaScript做出大膽的一般性陳述。感謝您編輯您的答案 –

0

您設置的時間間隔爲0秒(6000 * 0),3秒(3000 * 1)和24秒(24000 * 2)。這是因爲你乘以指數(i)。這是你試圖達到的時間間隔嗎?

+0

好吧,如果我只是使用價值,它會工作(這是我第一次使用),但現在它有不同的價值。 – user759235

+0

那麼索引器的使用會導致錯誤?如果沒有,請具體說明您想要達到的具體時間間隔。 – SonOfNun

+0

以及我想每運行一段代碼xxx秒(取決於值),如果我在上面的例子中使用固定值10000,它會運行一段代碼,然後等待10秒鐘,然後繼續前進,並且運行一段代碼並等待10秒鐘等等。是的,索引不是我認爲正確使用的值,不是具有不同的值。 – user759235

0

time*i - 這可能是您的問題。以您提供的數據爲例,您將獲得以下時間:6000,3000,12000

讓我們乘以i,您將獲得0,3000,24000

編輯: 正如下面的評論中所建議的,你希望第一個值總是爲零,並且結果值保留原樣。

將超時的延遲設置爲i == 0 ? 0 : time可行。

這基本上意味着expression ? true : false;

下面是一個例子:http://jsfiddle.net/2ka9g/1/

+0

是的,這是問題,但我該如何解決這個問題? – user759235

+0

只是不乘以'我'。只要使用'時間'。 – ahren

+0

好吧,但第一個值應該是0 – user759235