2011-06-23 91 views
0

我正在對URL進行遞歸調用,直到它返回成功或已達到最大嘗試限制。下面是相關的代碼,(精縮,可以這麼說):Javascript遞歸setTimeout不使用完整的最終JSON返回

function doSomething(numRetries) { 
    $.post('someURL', {retry: numRetries}, 
     function (data) { 
      if (data.value == 1) { 
       displayResults(data.message, data.value); 
      } else if (data.value == "retry") { 
       setTimeout(function() { doSomething(data.retries) }, 1000); 
      } else { 
       displayResults(data.message, data.value); 
      } 
     }, 
     "json" 
    ); 
} 

IFF的第一調用sumeURL返回data.value == 1,則執行displaySuccess。同樣,如果它返回另一個值(例如0),它將成功顯示失敗()。

問題在於遞歸部分。在啓動重試之後,會執行再次以遞增的重試值調用doSomething(),但之後的任何返回數據都不會被使用。

所以,當內部someURL我的重試超​​時是3,例如,我可以在螢火看到:

post('someURL', 0) returns JSONified (value = "retry", retries = 1) 
post('someURL', 1) returns JSONified (value = "retry", retries = 2) 
post('someURL', 2) returns JSONified (value = 0, error = "Display this error!") 

但警報()內displayFailure指示錯誤= [未定義],即使值= 0 (不是「重試」)。 Firebug表明正在進行正確的JSON解析。

編輯修改DoSomething的是現實中更準確地反映,儘管改變不應該引入任何不確定性,以及按要求,這裏有來自後期的實際通話返回值:

{"success":"retry","retryCount":"1"} 
{"success":"retry","retryCount":"2"} 
{"success":0,"errormsg":"The request is taking longer than expected, but should be completed soon. Please try again in 15 minutes."} 

最後這裏是一個縮小顯示結果():

function displayResults(text, status) { 
    $('#dispElem').queue(function(next) { //this is so that fades happen around the text update, not before/during it; there may be better ways to do this 
     $('#dispElem').html(text); 
     if (status == 1) { 
      $('#dispElem').addClass("success"); 
     } else { 
      // hide and show random elements 
     } 
     next(); 
    }).fadeIn().queue(function(next) { //scroll to bottom; next(); }); 
} 
+3

沒有什麼突然出現在我身上,顯然是錯誤的。也許你可以發佈你的displayFailure()函數呢? – nnnnnn

+1

您嘗試訪問的屬性名稱存在某些問題,或者'displayFailure()'函數中存在一些問題。無論哪種方式,問題中的代碼都無法知道問題。請發佈'displayFailure()'函數,並收到原始的JSON數據。 – user113716

+0

我不相信錯誤在於這段代碼。大概在你的displayFailiure函數中。 – Slappy

回答

0

arrrgh。

所有最糟糕的情況 - 大寫/小寫錯誤我只是不得不忽略,直到被迫重新輸入以縮小。

謝謝,所有的評論,讓我重新組合,用更細的牙齒,可以這麼說。