使用jquery-ajaxq实现重试逻辑的最佳方法是什么?

时间:2014-01-30 23:00:50

标签: jquery ajax error-handling timeout jquery-ajaxq

我们正在使用jquery-ajaxq来阻止特定请求同时运行。除了我们客户的网络很糟糕外,它运作良好。我们经常会看到HTTP状态代码为0的超时或错误,seems to indicate连接失败或请求取消。在状态代码为0的特定情况下,我们要在放弃并向用户显示错误消息之前重试x次。

great Stack Overflow answers使用$.ajax(this)显示如何执行此操作,但这些不适用,因为我们使用的是ajaxq。

以下是我们的代码现在如何运作的概述:

doAjax = function(incomingOpts) {
    // do some option defaulting here
    //...

    var options = {
        //...
        success: function(data, textStatus, jqXHR) {
            // basically, if we get here, we could still have an app
            // level error so we check for that and call the appropriate
            // callback
            if ( blah blah ) {
                incomingOpts.handleSuccess(data);
            else
                incomingOpts.handleError(data);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            // throw up a big error dialog to the user with
            // as much data as we can include about what happened
            //...
        }
    };

    _.extend(options, incomingOpts);
    return $.ajaxq(options.url.substring(0, 30), options);
};

在错误方法中很容易识别出我们想要在上面的错误函数中重试的条件:

if ( textStatus === "error" && errorThrown === "" && jqXHR.status === "0" ) {
    // then we want to retry
}

我们遇到的问题是如何实现重试逻辑。另外,我们需要确保堆栈中只有一个调用可以记录错误,如果它们全部失败并确保如果其中一个重试实际有效,则只有一个调用适当的成功函数。

1 个答案:

答案 0 :(得分:0)

在我看来这是ajaxq插件中的一个缺陷。它应该将回调的上下文设置为options对象或指定的上下文。我会通过修改插件的第41行来修复它,使其与此类似(未经测试):

var context = options.context || options;
if (originalCompleteCallback) {    
    originalCompleteCallback.call(context, request, status); 
}

现在您可以使用完整版中的this作为原始选项集来解决它,然后您可以重复使用与您链接的答案相同的想法重新发送请求。