我正在对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