Javascript递归setTimeout不使用返回的完整最终JSON
我对URL进行递归调用,直到它返回成功或达到最大尝试次数限制。以下是相关代码,可以说是缩小了:Javascript递归setTimeout不使用返回的完整最终JSON,javascript,jquery,recursion,Javascript,Jquery,Recursion,我对URL进行递归调用,直到它返回成功或达到最大尝试次数限制。以下是相关代码,可以说是缩小了: function doSomething(numRetries) { $.post('someURL', {retry: numRetries}, function (data) { if (data.value == 1) { displayResults(data.message, data.value);
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"
);
}
如果对sumeURL的第一个调用返回data.value==1,则执行displaySuccess。类似地,如果它返回另一个值,例如0,它将成功显示Failure
问题在于递归部分。在开始重试之后,它确实会使用递增的重试值再次调用doSomething,但之后的任何返回数据都不会被使用
例如,当我在someURL中的重试超时为3时,我可以在firebug中看到:
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内部的警报表示错误=[undefined],即使值=0,也不会重试。Firebug表示正在进行正确的JSON解析
编辑并修改剂量测量以更准确地反映实际情况,尽管这些更改不应引入任何不确定性,根据请求,以下是post调用的实际返回值:
{"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函数?可能是您尝试访问的属性名称有问题,或者displayFailure函数中有问题。无论哪种方式,都无法从问题中的代码中了解问题。请发布displayFailure函数,以及收到的原始JSON数据。我认为错误不在这段代码中。可能在displayFailiure函数中。请注意,这不是真正的递归。.post回调是异步的,setTimeout处理程序也是异步的。在任何给定的时间,剂量测定功能只有一次激活。递归函数是直接调用自身的函数,因此有多个激活嵌套在另一个之上。公平点re:不是真正的递归。我不在工作,所以明天我会尽可能多地更新更多的信息。并不是说这里有什么真正的秘密,但我仍然需要保护我正在工作的页面的身份。我很感激这些评论为我指明了重新评估其他代码的方向。这很令人沮丧,但很高兴知道也许我没有做错什么。