jQuery触发器功能是否保证是同步的

时间:2012-12-24 04:17:16

标签: javascript jquery javascript-events concurrency

触发功能似乎是同步的。也就是说,所有绑定函数似乎是按顺序同步执行的(调用函数可以异步执行某些操作,但这不是问题)。

这适用于自定义和非自定义(点击,悬停等)事件吗?是否存在javascript的单线程保证不成立的事件?

如果确实如此,是否可以更改行为以异步方式执行它们而不将超时插入到每个绑定函数中?

以下是一个展示问题的示例:

var ele = $('#blah');
// Example of the bound function doing something synchronously
ele.bind('customEvent.sync', function() {
    // Do something synchronously
    window.foo = 'foo';
});

// Example of the bound function doing something asynchronously
ele.bind('customEvent.async', function() {
    window.setTimeout(function() {
        // Do something asynchronously
        window.bar = 'bar';
    }, 0);
});

// Trigger both events
ele.trigger('customEvent');

// If trigger is guaranteed to be synchronous this should alert 'foo:undefined' or possibly 'foo:bar' depending on whether the asych function was called first
// If trigger is NOT synchronous 'undefined:undefined', 'foo:undefined', 'undefined:bar', or 'foo:bar' could be alerted
alert(window.foo + ':' + window.bar);

更新 请参阅:Is JavaScript guaranteed to be single-threaded? 由于javascript的单线程特性,自定义事件保证是同步的。由于浏览器不一致,某些内置事件类型可能不同步。

1 个答案:

答案 0 :(得分:17)

我自己上面提供的一个轻微修改的评论集 - Beetroot-Beetroot:

  • 活动没有持续时间;提供一个处理程序,它们会导致一个线程启动。因此,事件本身既不是同步也不是异步。事件激发的线程将始终是同步的,但可能会启动一个或多个异步进程。

  • 无论可能在触发事件处理程序中启动的任何异步进程如何,对.trigger()的调用始终是同步的。当触发的处理程序返回时,执行将返回到.trigger(...)之后的语句。即,.trigger()是一个美化的函数调用。

  • 在javascript中,当使用setTimeout()启动任何内容之前,当前线程绝对保证运行完成,即使超时持续时间为0.与ajax相同 - 一个调用的线程,比如{ {1}}保证在任何成功/错误/完成处理程序开始之前运行完成,即使服务器要立即响应。

  • 单线程是ECMA-262(javascript)固有的,即。在任何时候,最多可以运行一个线程。

补充要点:

Is javascript guaranteed to be single-threaded?的加速答案是基于错误的前提。没有证据表明javascript不是单线程的。 @KrisGiesing的评论揭穿了误解。