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

时间:2011-06-23 02:34:53

标签: javascript jquery recursion

我正在对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"
    );
}

IFF 第一次调用sumeURL返回data.value == 1,它执行displaySuccess。同样,如果它返回另一个值(例如0),它将成功显示失败()。

问题在于递归部分。启动重试后,再次使用递增的重试值调用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()表示error = [undefined],即使value = 0(不是“retry”)。 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."}

最后这里是一个缩小的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(); });
}

1 个答案:

答案 0 :(得分:0)

Arrrgh。

最糟糕的情况 - 一个大写/小写的错误,我一直忽视,直到被迫重新打字缩小。

非常感谢所有评论,并让我用更精细的牙齿重新推荐它,可以这么说。