JavaScript 回调是否阻塞?
Is JavaScript callbacks blocking?
如果我向事件监听器注册了一个耗时的回调函数,并且这个事件在短时间内触发了两次。第二次回调会不会被第一次回调阻塞?
我在浏览器中尝试过:
document.body.onclick = function() {
var date = new Date;
console.log('click event at ' + date);
while(new Date - date < 1e4) {};
console.log('callback end');
}
结果,在第一个回调完成后立即执行了第二个回调。
所以现在我对JavaScript非阻塞异步模块很困惑:哪一部分是异步执行的?
浏览器中的 Javascript 是单线程的,并在事件队列中工作。在触发下一个事件之前,一个事件将 运行 完成。因此,如果在第一次点击仍在处理时发生第二次点击,第二次点击将排队,并且不会 运行 直到代码处理第一次点击完成。
您可以在此处阅读有关此事件队列概念的更多信息:
How does JavaScript handle AJAX responses in the background?
在您的特定示例中,一旦您的代码开始 运行ning,它就是同步的。 while
循环 运行s 直到完成并且正在阻塞(保持 运行ning 中的任何其他 Javascript 直到它完成)。
将来有一些异步方法可以将某些代码安排到 运行(使用 setTimeout()
或 setInterval()
),同时允许其他代码到 运行 ,但您没有使用该机制。
如果我向事件监听器注册了一个耗时的回调函数,并且这个事件在短时间内触发了两次。第二次回调会不会被第一次回调阻塞?
我在浏览器中尝试过:
document.body.onclick = function() {
var date = new Date;
console.log('click event at ' + date);
while(new Date - date < 1e4) {};
console.log('callback end');
}
结果,在第一个回调完成后立即执行了第二个回调。
所以现在我对JavaScript非阻塞异步模块很困惑:哪一部分是异步执行的?
Javascript 是单线程的,并在事件队列中工作。在触发下一个事件之前,一个事件将 运行 完成。因此,如果在第一次点击仍在处理时发生第二次点击,第二次点击将排队,并且不会 运行 直到代码处理第一次点击完成。
您可以在此处阅读有关此事件队列概念的更多信息:
How does JavaScript handle AJAX responses in the background?
在您的特定示例中,一旦您的代码开始 运行ning,它就是同步的。 while
循环 运行s 直到完成并且正在阻塞(保持 运行ning 中的任何其他 Javascript 直到它完成)。
将来有一些异步方法可以将某些代码安排到 运行(使用 setTimeout()
或 setInterval()
),同时允许其他代码到 运行 ,但您没有使用该机制。