【问题标题】:MooTools synchronous request makes 'onRequest' useless?MooTools 同步请求使“onRequest”无用?
【发布时间】:2012-03-01 11:04:32
【问题描述】:

我有几个想要同步处理的 MooTools XHR 请求。所以我在创建新的请求对象时使用选项async: false 并且效果很好。但是,我还想通知用户浏览器会很忙。为此,我想使用onRequest,所以当请求触发时,它会显示一条消息并且然后变得很忙,之后onComplete会带来更多的东西。

但是,我在onRequest 中输入的内容似乎没有被执行。请求立即触发,立即锁定浏览器,完成后,onComplete 的东西就来了。那么这是否会使onRequest 选项与async: false 结合使用时无用?什么是“解决方法”?我想链接可以解决问题,但与简单地使用 onRequest 相比,这似乎很混乱。

【问题讨论】:

    标签: ajax xmlhttprequest mootools


    【解决方案1】:

    这很可疑 - 虽然我不确定它在跨浏览器中的表现如何。你在用什么?我自己在 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 对象实例之前分派事件,但我认为不需要它。使用同步 ajax 是失败主义和反模式,尽管它可能在验证用户名可用性或其他方面有潜在用途。

    edit 似乎在 xhr.send 之前中断了 webkit 并阻止 ui 线程进行 DOM 更新。它似乎更新了元素属性,但将实际的回流排入队列以备后用。我会看看我们是否可以在设置 xhr 之前更改 mootools 以触发事件。很好的收获。

    我已提交票证,请观看补丁或按照worst case bit 中的建议进行操作:

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

    【讨论】:

    • 非常感谢!确实,我正在使用 Safari。我通过将console.info('hit'); 放在onRequest 中非常简单地进行了尝试。它不会说“命中”。您的示例也演示了这种效果。我意识到同步 ajax 并不酷,但这只是每 10 到 15 个 ajax 中的大约 1 个,而且确实重要的事情正在发生。但我正在研究一种服务器端解决方案,以避免在 javascript 中执行同步 ajax 或一些复杂的检查方案。
    • 它确实运行 onRequest - 只是它不显示对 DOM 的任何更改,直到 UI 线程解锁之后。
    • 好吧,如果它确实改变了 DOM,它可能会很有用;-)
    猜你喜欢
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多