簡體   English   中英

延遲setTimeout()

[英]Delaying a setTimeout()

我遇到了一些異步JavaScript代碼的問題,這些異步JavaScript代碼使用ajax從數據庫中獲取值。

本質上,我想做的是在填充列表后刷新頁面。 為此,我嘗試將以下代碼插入到填充列表的函數中:

var timer1;
timer1 = setTimeout([refresh function], 1000);

就像您想象的那樣,當列表填充花費的時間少於1秒時,此方法會很好地工作,而花費更長的時間會導致問題。 因此,我想到了將這些代碼插入到每次ajax調用成功時調用的函數中的想法:

clearTimeout(timer1);
timer1 = setTimeout([refresh function], 1000);

因此,從理論上講,每次獲取列表元素時,計時器都應重置,這意味着僅應在成功檢索到最終列表元素之后的1秒鍾調用刷新功能。 但是,在執行過程中,發生的一切只是將timer1重置一次 ,即第一次到達第二個代碼塊。

有人可以看到問題所在嗎? 還是有更好的方法呢? 謝謝。

==========

編輯:清除我的ajax調用是如何工作的:代碼結構的問題之一是 ajax調用實際上是嵌套的; 原始ajax調用的回調方法本身就是另一個ajax調用,其回調方法包含數據庫事務 (不正確-參見下文)。 另外,我有兩種同時運行的方法。 我需要的是一種在刷新頁面之前確保所有級別的所有調用都已完成的方法。 這就是為什么我認為給兩個方法一個計時器,並在每次調用其中一個回調方法時將其重置,會一直將其執行推遲到所有線程完成為止。

老實說,該代碼非常復雜-大約140行(包括輔助方法)-我認為在此處發布它並不可行。 抱歉-如果沒有代碼,誰也無法幫忙,那么也許我會硬着頭皮,嘗試以某種有意義的格式將其復制到此處。

==========

EDIT2:這是該方法嘗試執行的常規工作流程。 該功能是一種“同步”功能,既可以向服務器發送數據,又可以從服務器檢索數據。

  • I.調用從本地數據庫檢索項目的函數
  • 一世。 每次獲取項目時,都會將其發送到服務器(ajax)
  • 一種。 當ajax回調時,該項目將在本地更新以反映其成功/失敗

  • 二。 從本地數據庫檢索(單獨的)項目列表

  • 一世。 每次獲取項目時,都會從服務器(ajax)獲取與該項目的ID相匹配的項目
  • 一種。 從服務器成功獲取后,將比較項目
  • b。 如果服務器端項是較新的,則本地項將更新

因此,我在上面的第二個代碼塊中插入的位置在“ i”中。 每個方法的各個部分,換句話說,應該重復調用ajax。 我意識到我在上面的評論中有誤; 實際上,從來沒有嵌套的Ajax調用,而是在數據庫事務內部的ajax調用內部存在數據庫事務。

到目前為止,您的表現還不錯。 您想使用的技巧是將事件鏈接在一起,如下所示:

function refresh()
{
    invokeMyAjaxCall(param1, param2, param3, onSuccessCallback, onFailureCallback);
}

function onSuccessCallback()
{
    // Update my objects here

    // Once all the objects have been updated, trigger another ajax call
    setTimeout(refresh, 1000);
}

function onFailureCallback()
{
    // Notify the user that something failed

    // Once you've dealt with the failures, trigger another call in 1 sec
    setTimeout(refresh, 1000);
}

現在,這樣做的困難是:如果呼叫失敗,會發生什么? 理想情況下,聽起來像是要確保您不斷更新服務器中的信息,即使發生臨時故障,您也要繼續前進。

我在這里假設您的AJAX庫允許您執行失敗回調。 但是,我已經看到某些情況下庫掛起而失敗或失敗的情況。 如有必要,您可能需要使用一組單獨的邏輯來確定與服務器的連接是否已中斷,然后重新啟動回調序列。

編輯:我懷疑您遇到的問題是在完成第一個電話之前排隊下一個電話的結果。 基本上,您是在設置競爭條件:第一個通話可以在觸發下一個通話之前完成嗎? 它可能大多數時候都可以工作,或者一次可以工作,或者幾乎可以一直工作。 但是除非setTimeout()是您的“響應處理”代碼中的最后一條語句,否則這種競爭條件將始終是潛在的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM