如果用户提交了一个请求而很久没有得到响应(也许永远也得不到了, 也许还需要很久才能得到, whatever) , 那么他有权取消这个请求.
怎样打断jsf2的ajax请求? 根据官方文档, 似乎没有打断/取消的方式. 阅读了内置的jsf.js文件, 发现确实没有 abort 方法.
google之, 也没有什么解决方案(jsf2的技术资料好少, 大部分都是入门介绍而已)
于是自己动手, 暂时想出两个解决方案如下
1) 调用window.stop();
很好, 所有请求都被中断了. 这是个简单暴力的方法, 应该适用于同一时间只有一个连接请求的场景, 事实上大多数应用一次都只有一个请求
2) 如果不要这么简单暴力呢?
不暴力的方式暂时没有想出来, 但还想出一个不简单的方式... 其实也不复杂, 就是修改jsf.js
如果要实现打断指定的请求, 那么就必须取得该发出请求xhr对象的句柄. 通过修改下面的代码, 就可以拿到xhr对象:
//黄色部分即为添加的代码
google之, 也没有什么解决方案(jsf2的技术资料好少, 大部分都是入门介绍而已)
于是自己动手, 暂时想出两个解决方案如下
1) 调用window.stop();
很好, 所有请求都被中断了. 这是个简单暴力的方法, 应该适用于同一时间只有一个连接请求的场景, 事实上大多数应用一次都只有一个请求
2) 如果不要这么简单暴力呢?
不暴力的方式暂时没有想出来, 但还想出一个不简单的方式... 其实也不复杂, 就是修改jsf.js
如果要实现打断指定的请求, 那么就必须取得该发出请求xhr对象的句柄. 通过修改下面的代码, 就可以拿到xhr对象:
//黄色部分即为添加的代码

data.request就是刚刚传入的xhr对象了
我在 status=="begin" 时写了两行代码,其中 data.source.xhr=data.request 把xhr对象句柄交给了事件源对象, 一般来说, 就是点击的那个按钮, 那么以后 somebtn.xhr 就是这个请求对象了.
如果不放心, 我还用了一个alert, 显示结果就是httprequest对象, 妥妥的.
有了xhr对象句柄, 剩下的想怎么玩怎么玩吧
另求其它的解决方案.
--
from: huxiaodi