javascript - jQuery触发函数是否保证同步

标签 javascript jquery concurrency jquery-events

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

对于自定义和非自定义(单击、悬停等)事件来说,情况是否如此?是否存在 Javascript 的单线程保证不成立的情况?

如果是 true,是否可以更改行为以异步执行它们,而不在每个绑定(bind)函数中插入超时?

这是一个演示问题的示例:

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 的单线程特性,自定义事件保证是同步的。由于浏览器不一致,某些内置事件类型可能不同步。

最佳答案

我自己在上面提供的评论选集 - Beetroot-Beetroot :

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

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

  • 在 javascript 中,当前线程绝对保证在 setTimeout() 执行的任何操作开始之前运行完成,即使超时持续时间为 0。与 ajax 相同 - 一个线程调用 $.ajax(...) 保证在任何成功/错误/完成处理程序开始之前运行完成,即使服务器立即响应也是如此。

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

补充一点:

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

关于javascript - jQuery触发函数是否保证同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14017013/

相关文章:

javascript - 在 Javascript 中获取 TinyUrl

javascript - 为什么 setCustomValidity() 在 React 应用程序中不起作用?

javascript - javascript 中的迭代和循环

jquery - 一个好的 jQuery <select> CSS 插件?

javascript - 我想如果有 2 个元素具有相同的文本,一个在 jquery 中被删除

单一读者和单一作者的 Golang 分配安全

javascript - array.splice() 给出错误 TypeError : arr. splice 不是函数(…)

javascript - 通过ajax将数组发送到php。

具有 Future 返回类型的 Scala 递归函数

java - Collectors.joining (",") 是线程安全的吗?