触发功能看起来是同步的。也就是说,所有绑定的函数看起来都是按顺序同步执行的(被调用的函数可以异步执行,但这不是问题所在)。
对于自定义和非自定义(单击、悬停等)事件是否如此?有没有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的单线程特性。由于浏览器不一致,某些内置事件类型可能不同步。
发布于 2012-12-24 14:26:12
上面由我自己-甜菜根-甜菜根提供的略微修改的评论集:
.trigger()
的调用始终是同步的,而不管触发的事件处理程序中可能启动的任何异步进程。当触发的处理程序返回时,执行将恢复到.trigger(...)后面的语句。例如,.trigger()是一个美化的函数调用。$.ajax(...)
的线程保证在任何成功/错误/完成处理程序开始之前运行完成,即使服务器立即响应也是如此。附加点:
对Is javascript guaranteed to be single-threaded?的接受答案是基于一个错误的前提。没有证据表明javascript不是单线程的。@KrisGiesing的评论揭穿了这种误解。
https://stackoverflow.com/questions/14017013
复制相似问题