MooTools同步请求使'onRequest'无用吗?

时间:2012-03-01 11:04:32

标签: ajax xmlhttprequest mootools

我想要同步处理几个MooTools XHR请求。所以我在创建一个新的请求对象时使用选项async: false,并且工作正常。但是,我还想告知用户浏览器将忙碌。为此,我想使用onRequest,因此当请求触发时,它会显示一条消息并且然后变得忙碌,之后会有更多内容onComplete

然而,我放入onRequest的东西似乎没有被执行。请求立即触发,立即锁定浏览器,一旦完成,onComplete内容就会出现。这样,与onRequest结合使async: false选项无效吗?什么是“解决方法”?我想链接可以解决问题,但与简单地使用onRequest相比,这似乎很混乱。

1 个答案:

答案 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位的建议进行了操作:

https://github.com/mootools/mootools-core/issues/2317