gpt4 book ai didi

javascript - JavaScript 的 setInterval 可以阻止线程执行吗?

转载 作者:行者123 更新时间:2023-11-30 06:59:37 25 4
gpt4 key购买 nike

setInterval 会导致页面中的其他脚本阻塞吗?

我正在开发一个将与 Gmail 相关的小书签转换为 Google Chrome 扩展程序的项目。小书签使用 gmailgreasemonkey API 与 gmail 页面进行交互。 API 的 JavaScript 对象是 Gmail 页面最后加载的部分之一,并通过 XMLHttpRequest 加载到页面中。由于我需要访问此对象,并且全局 JavaScript 变量对扩展内容脚本隐藏,因此我将一个脚本注入(inject)到 gmail 页面中,该页面轮询变量的定义,然后访问它。我正在使用 setInterval 函数进行轮询。这在大约 80% 的时间里都有效。其余时间轮询函数会一直轮询,直到达到我设置的限制,并且在页面中从未定义过greasemonkey API 对象。

注入(inject)的脚本示例:

    var attemptCount = 0;

var attemptLoad = function(callback) {

if (typeof(gmonkey) != "undefined"){
clearInterval(intervalId); // unregister this function for interval execution.
gmonkey.load('1.0', function (gmail) {
self.gmail = gmail;
if (callback) { callback(); }
});
}
else {
attemptCount ++;
console.log("Gmonkey not yet loaded: " + attemptCount );
if (attemptCount > 30) {
console.log("Could not fing Gmonkey in the gmail page after thirty seconds. Aborting");
clearInterval(intervalId); // unregister this function for interval execution.
};
}
};

var intervalId = setInterval(function(){attemptLoad(callback);}, 1000);

最佳答案

Javascript 是单线程的(除了我们在这里不讨论的网络 worker )。这意味着只要执行的常规 javascript 线程正在运行,您的 setInterval()在常规的 javascript 线程执行完成之前,计时器不会运行。

同样,如果您的 setInterval()处理程序正在执行,在您的 setInterval() 之前不会触发其他 javascript 事件处理程序处理程序完成执行它的当前调用。

所以,只要你的 setInterval()处理程序不会卡住并永远运行,它不会阻止其他事情最终运行。它可能会稍微延迟它们,但它们仍然会在当前的 setInterval() 后立即运行线程完成。

在内部,javascript 引擎使用队列。当某事要运行(如事件处理程序或 setInterval() 回调)并且某事已经在运行时,它会将事件插入队列。当当前 javascript 线程完成执行时,JS 引擎检查事件队列,如果那里有东西,它会选择那里最旧的事件并调用其事件处理程序。

以下是有关 Javascript 事件系统如何工作的其他一些引用资料:

How does JavaScript handle AJAX responses in the background?

Are calls to Javascript methods thread-safe or synchronized?

Do I need to be concerned with race conditions with asynchronous Javascript?

关于javascript - JavaScript 的 setInterval 可以阻止线程执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11978532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com