我正在對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(); });
}
沒有什麼突然出現在我身上,顯然是錯誤的。也許你可以發佈你的displayFailure()函數呢? – nnnnnn
您嘗試訪問的屬性名稱存在某些問題,或者'displayFailure()'函數中存在一些問題。無論哪種方式,問題中的代碼都無法知道問題。請發佈'displayFailure()'函數,並收到原始的JSON數據。 – user113716
我不相信錯誤在於這段代碼。大概在你的displayFailiure函數中。 – Slappy