0

我们使用jquery-ajaxq来防止特定请求同时运行。它运行良好,只是我们客户的网络很糟糕。我们经常看到 HTTP 状态代码为 0 的超时或错误,这似乎表明连接失败或请求取消。在状态码为 0 的特定情况下,我们希望在放弃并向用户显示错误消息之前重试 x 次。

很好的 Stack Overflow 答案展示了如何使用这些答案,$.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
}

我们遇到的问题是如何实现重试逻辑。此外,如果所有调用都失败,我们需要确保堆栈中只有一个调用来记录错误,并确保只有一个调用如果其中一次重试确实有效,则为相应的成功函数。

4

1 回答 1

0

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

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

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

于 2014-01-30T23:12:05.170 回答