首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否保证jQuery触发器函数是同步的

是否保证jQuery触发器函数是同步的
EN

Stack Overflow用户
提问于 2012-12-24 12:17:16
回答 1查看 6.6K关注 0票数 18

触发功能看起来是同步的。也就是说,所有绑定的函数看起来都是按顺序同步执行的(被调用的函数可以异步执行,但这不是问题所在)。

对于自定义和非自定义(单击、悬停等)事件是否如此?有没有Javascript的单线程保证不成立的事件?

如果是真的,是否可以将行为更改为异步执行它们,而无需在每个绑定函数中插入超时?

下面是一个示例,演示了这个问题:

代码语言: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);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-24 14:26:12

上面由我自己-甜菜根-甜菜根提供的略微修改的评论集:

  • 事件没有持续时间;如果附加了处理程序,则它们会导致线程启动。因此,事件本身既不能是同步的,也不能是异步的。事件激发的线程将始终是同步的,但可能会启动一个或多个异步进程。
  • .trigger()的调用始终是同步的,而不管触发的事件处理程序中可能启动的任何异步进程。当触发的处理程序返回时,执行将恢复到.trigger(...)后面的语句。例如,.trigger()是一个美化的函数调用。
  • 在javascript中,当前线程绝对保证在使用setTimeout()启动之前运行完成,即使超时持续时间为0。ajax也是如此-调用$.ajax(...)的线程保证在任何成功/错误/完成处理程序开始之前运行完成,即使服务器立即响应也是如此。
  • Single-threadedness是ECMA-262 (javascript)固有的,即。在任何时刻,最多只能运行一个线程。

附加点:

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

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14017013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档