昨天组里发现一个Ajax abort中断不生效的问题,首先环境是基于移动端zepto的ajax来发送请求的,在发送请求后立即调用了xhr.abort()去中断,但是zepto的最终处理总是timeout,就此问题,分析了一下zepto发送ajax的源码,突然一下子清晰了很多,同时也找到了问题所在。首先,zepto的处理是正确的,只是xhr.onreadystatechange()方法中并未监听到xhr.readyState已完成的状态变化(即xhr.readyState == 4),正常来讲当一个ajax请求正常被abort以后,除了服务器连接已建立(xhr.readyState == 1)的状态变化外,还会出发一次请求已完成(xhr.readyState == 4)的状态变化,且此时xhr.status == 0,关于xhr.status == 0有三种说法,参见一下链接~,说道这里,问题的关键就在于xhr.readyState状态变化的监听,由于移动端对ajax的请求做了拦截,当abort发生时,并未修改xhr.readyState这个状态,因此导致了zepto里面的执行逻辑木有走。。。。
【转】AJAX问题之XMLHttpRequest status = 0
【参考】zepto源码研究 - ajax.js(请求过程中的各个事件分析)
【参考】Zepto Ajax 事件 )