我想要同步处理几个MooTools XHR请求。所以我在创建一个新的请求对象时使用选项async: false
,并且工作正常。但是,我还想告知用户浏览器将忙碌。为此,我想使用onRequest
,因此当请求触发时,它会显示一条消息并且然后变得忙碌,之后会有更多内容onComplete
。
然而,我放入onRequest
的东西似乎没有被执行。请求立即触发,立即锁定浏览器,一旦完成,onComplete
内容就会出现。这样,与onRequest
结合使async: false
选项无效吗?什么是“解决方法”?我想链接可以解决问题,但与简单地使用onRequest
相比,这似乎很混乱。
答案 0 :(得分:2)
这很可疑 - 虽然我不确定它会如何表现出跨浏览器。你在用什么?我在FireFox中没有经历过同样的事情。
MooTools首先创建了xhr对象,然后触发onRequest
事件:
https://github.com/mootools/mootools-core/blob/master/Source/Request/Request.js#L199-212
它那么xhr.send(data);
- 不应该有任何情况下浏览器会阻止UI线程并且不会触发事件(回调本身是异步的)。
在jsfiddle上查看这个示例,响应中有3秒的延迟,并且在完成后会触发下面的警报,onRequest会正确触发:
http://jsfiddle.net/dimitar/gDjJG/
最糟糕的情况,我想你可以重构Request.send以在它创建xhr对象实例之前调度该事件,但我认为不需要它。使用sync ajax是失败者和反模式,尽管它可能有用于验证用户名可用性等等。
编辑 似乎打破了webkit并在xhr.send之前阻止ui线程进行DOM更新。它似乎更新了element属性,但是后来为了实际的重新流程。我将看看我们是否可以在设置xhr之前更改mootools来触发事件。好抓。
我已经提交了票证,看了它是为了补丁还是按照worst case
位的建议进行了操作: