2012-03-01 67 views
0

我有几个MooTools XHR请求,我想同步处理。所以我在创建一个新的请求对象时使用选项async: false,并且工作正常。不过,我也想告诉用户浏览器会很忙。为此,我想利用onRequest,所以当请求触发时,它会显示一条消息并,然后变得忙碌起来,之后会有更多的东西与onCompleteMooTools同步请求使'onRequest'无用?

但是,我放入onRequest的东西似乎没有得到执行。请求立即启动,立即锁定浏览器,完成后,onComplete就会出现。那么这是否会使onRequest选项在与async: false结合时无用? “解决方法”是什么?我想链接会做的伎俩,但这似乎凌乱相比,简单地使用onRequest

回答

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对象实例之前分派事件,但我不认为它需要它。使用同步阿贾克斯是失败者和反模式,虽然它可能有用于验证用户名可用性或任何。

编辑似乎在WebKit的突破和阻塞UI线程DOM更新xhr.send了。它似乎更新元素属性,但后来为QUEUE实际回流。我会看看我们是否可以在xhr设置之前更改mootools来触发事件。接得好。

我已经申请了门票,看它的补丁或做在worst case位建议:

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

+0

非常感谢!的确,我正在使用Safari。我通过在'onRequest'中放置'console.info('hit');'来试用它。它不会说'打'。你的例子也演示了这种效果。我意识到同步阿贾克斯是不酷的,但这只是每10-15年1阿贾克斯,并且确实重要的事情正在进行。但我正在研究一个服务器端解决方案,以避免在javascript中执行同步ajax或一些复杂的检查方案。 – kasimir 2012-03-01 11:51:08

+0

它运行onRequest - 只有在UI线程解锁后它才会显示DOM的任何更改。 – 2012-03-01 12:07:25

+0

好吧,它可能会有用,如果它改变了DOM,但;-) – kasimir 2012-03-01 12:58:27