首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用jquery-ajaxq实现重试逻辑的最佳方式是什么?

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

Stack Overflow用户
提问于 2014-01-31 07:00:50
回答 1查看 400关注 0票数 0

我们使用jquery-ajaxq来防止特定的请求同时运行。它工作得很好,除了我们客户的网络很糟糕。在状态码为0的特定情况下,在放弃并向用户显示错误消息之前,我们希望重试x次。

有一些great Stack Overflow answers展示了如何使用$.ajax(this)来实现这一点,但这些在这里是不起作用的,因为我们使用的是ajaxq。

下面是我们的代码现在的工作原理:

代码语言:javascript
复制
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);
};

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

代码语言:javascript
复制
if ( textStatus === "error" && errorThrown === "" && jqXHR.status === "0" ) {
    // then we want to retry
}

我们遇到的问题是如何实现重试逻辑。此外,我们需要确保堆栈中只有一个调用在所有调用都失败的情况下记录错误,并确保在其中一个重试实际有效的情况下只有一个调用适当的成功函数。

EN

回答 1

Stack Overflow用户

发布于 2014-01-31 07:12:05

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

代码语言:javascript
复制
var context = options.context || options;
if (originalCompleteCallback) {    
    originalCompleteCallback.call(context, request, status); 
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21469254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档