Javascript递归setTimeout没有't使用返回的完整最终JSON

Javascript recursive setTimeout doesn't use full final JSON returned

本文关键字:返回 JSON 没有 setTimeout 递归 Javascript      更新时间:2023-09-26

我对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的第一次调用返回数据,则执行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中的alert()表示错误=未定义,即使值=0(不是"重试")。Firebug表示正在进行正确的JSON解析。

EDIT修改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."}

最后是一个缩小的displayResults():

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

Arrrgh。

最糟糕的情况是,我一直忽略了一个大写/小写的错误,直到被迫重新键入以缩小。

谢谢大家的评论,可以说,让我用一颗更细的牙齿重新梳理它。