我们使用jquery-ajaxq来防止特定的请求同时运行。它工作得很好,除了我们客户的网络很糟糕。在状态码为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);
};在error方法中很容易识别我们想要在上面的error函数中重试的条件:
if ( textStatus === "error" && errorThrown === "" && jqXHR.status === "0" ) {
// then we want to retry
}我们遇到的问题是如何实现重试逻辑。此外,我们需要确保堆栈中只有一个调用在所有调用都失败的情况下记录错误,并确保在其中一个重试实际有效的情况下只有一个调用适当的成功函数。
发布于 2014-01-31 07:12:05
在我看来,这是ajaxq插件的一个缺陷。它应该将回调的上下文设置为options对象或指定的上下文。我会通过修改插件的第41行来修复它,使其类似于以下代码(未测试):
var context = options.context || options;
if (originalCompleteCallback) {
originalCompleteCallback.call(context, request, status);
}现在,您可以使用complete中的this作为原始选项集来解决它,然后可以重用这些选项,使用与您链接的答案相同的思想重新发送请求。
https://stackoverflow.com/questions/21469254
复制相似问题