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