使用Jquery Ajax进行错误处理以忽略已中止的请求。
Jquery Ajax错误处理程序忽略中止的原因是因为应用程序中存在长时间运行的Ajax调用,这些调用可能会被用户导航或临时连接/服务器故障中断。需要让错误处理程序仅在连接/服务器故障时运行,而不是在用户导航时运行。最初尝试了Alastair Pitts的答案,但由于中止请求和连接故障都会将状态码和就绪状态设置为0,所以无法工作。接下来尝试了sieppl的答案,也无法工作,因为在这两种情况下都没有响应,因此没有标头。唯一对我有效的解决方法是设置一个window.onbeforeunload的监听器,它设置一个全局变量来指示页面已被卸载。然后,错误处理程序可以检查并仅在页面未被卸载时调用错误处理程序。
var globalVars = {unloaded:false}; $(window).bind('beforeunload', function(){ globalVars.unloaded = true; }); ... $.ajax({ error: function(jqXHR,status,error){ if (globalVars.unloaded) return; } });
如果一个Ajax请求被JavaScript中断,则此解决方法无效。如果取消了卸载,则不会调用beforeunload处理程序。为什么在相同的方法中设置globalVars.unloaded为true,如果你要取消卸载?我只是说,如果你有一个大项目,在这个问题上遇到了困难,你必须去修复它中的所有beforeunload处理程序,仅添加你提供的一个新的处理程序是不够的。当用户导航到另一个页面时,beforeunload不会被调用,或者调用太晚了?
有时候在发生请求中止时,状态status
和/或就绪状态readyState
会等于0
。
在我的全局错误处理程序中,我在方法的顶部添加了一个检查:
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) { // 如果其中任何一个为真,则不是真正的错误,我们不关心 if (jqXHR.status === 0 || jqXHR.readyState === 0) { return; } // 在这里处理错误 });
我发现这对我来说完全有效。希望这对你或其他遇到这个问题的人有所帮助 🙂
如果无法连接到服务器,我得到的状态和就绪状态也是相同的。但这是我想要处理的错误,只是不想处理中止的错误。
是的,这会掩盖其他你想要看到的错误。