2013-02-20 78 views
1

此處存在一些間隔問題。clearINterval和範圍

基本concpt是,我有一個進度條功能,1元的東西行,是從後端腳本饋信息。我在一段時間內每5秒鐘對該腳本執行ping ajax調用。

這個工作,但也有以倍數(即第2個進度條調用相同的功能),或者當項目被「關閉」(一個div幻燈片),應立即停止問題。這是一些非常相互關聯的代碼,所以我會盡我所能提取必要的部分,但請注意,現在它可能不會運行。

一個完整的步行though-函數名稱已更改爲保護無辜者:)

onlcick,格打開,該啓動功能被稱爲:

function start(ID){ 
var request = $.ajax({ 
    url: "script?DO=Start&ID="+ID 
    , type: "GET"    
    , cache: false 
    , dataType: "text" 
}); 
request.done(function(msg) { 
    startLoop(ID);  

}); 
request.fail(function(jqXHR, textStatus) { 
    //alert("Request failed: " + textStatus);  
}); 
} 

,你可以看到,這個電話在startLoop FNC,繼續ping到更新信息的腳本(的getInfo())的信息:

function startLoop(ID){ 
var i = setInterval(function(){ 
    var xstatus = getInfo(ID); 
    //other stufff that works  
    if(xstatus=="done"){ 
     clearInterval(i); 
    } 

}, 5000); 
} 

這在它和自我正常工作。

如果第2點擊事件打開第二窗口,它只是一個新的ID,並調用相同的功能。

因此,我有一個我的時間間隔,並摧毀一個似乎停止一切。 我應該將i轉換爲對象,如i.ID?

另外,停車時,我有一個onclick =停止()調用,並從外循環,我似乎無法阻止它。

我如何重新安排這個工作?

它應該支持啓動,停止和autoupdating,1級或多個同步的項目。

回答

1

爲什麼不使用setTimeout代替clearInterval,因爲你已經把殺害其回調裏面的間隔有責任:

// using this approach might require changing the name of this function 
function startLoop(ID) { 
    setTimeout(function(){ 
     var xstatus = getInfo(ID); 

     //other stufff that works  
     if(xstatus!=="done"){ 
      startLoop(ID); // do it all over again if it's not complete 
     } 

    }, 5000); 
} 

這將給你相同的行爲,但有一對夫婦加獎金。首先,這不應該導致其他工作在完成時被殺死。另一個原因是它會異步運行,所以如果請求開始超過5秒鐘完成,超時將在它返回後的5秒內再次ping,而不是每5秒盲目發射一次,無論是否請求已完成。

+0

hrm ...我把它作爲setTimeout,並被告知這不是要走的路,間隔是更聰明的方法。 這會支持多個呼叫嗎? ID = 1和ID = 2調用相同的功能(因此,xstatus響應2個單獨的時間間隔)? – briansol 2013-02-20 20:10:54

+0

爲什麼使用setTimeout'不是要走的路? 它應該適用於多個呼叫;該ID由超時回調關閉,並且每次迭代都向前發送,並且對每次startLoop調用都分別進行維護。我在本地測試了這個,並且有兩個並排運行的循環方案似乎工作正常。 – BrMcMullin 2013-02-20 20:34:47

+0

感謝您的建議。我會努力工作並報告我的結果(有大量的事情正在進行) – briansol 2013-02-20 20:57:04