Javascript递归setTimeout不使用返回的完整最终JSON

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);

我对URL进行递归调用,直到它返回成功或达到最大尝试次数限制。以下是相关代码,可以说是缩小了:

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:不是真正的递归。我不在工作,所以明天我会尽可能多地更新更多的信息。并不是说这里有什么真正的秘密,但我仍然需要保护我正在工作的页面的身份。我很感激这些评论为我指明了重新评估其他代码的方向。这很令人沮丧,但很高兴知道也许我没有做错什么。