首先,我知道JavaScript是单线程的。 假设我有一个计数器,每秒输出一次值。
var counter = 0;
setInterval(function(){
console.log("Interval: " + ++counter);
}, 1000);
在某些时候,我想触发一些停止执行脚本的代码。 例如,一条警报消息。
setTimeout(function(){
alert("Some alert message");
},10000);
此时弹出警报消息时,间隔代码将暂停。 有没有技巧,所以它不会停止执行?
答案 0 :(得分:1)
首先:你知道如果代码没有停止,弹出窗口会在屏幕上叠加到无穷大吗?
警报主要用于简单的网页和调试目的(它是最简单的断点)。如果您想在我们的网站上通知用户,请使用某个框架或只创建HTML popup。我刚刚需要这个并下载了Jquery UI framework。我并不是那种在任何地方都使用jQuery的人,但是在浏览器中使用HTML弹出窗口非常简单而且很乏味。
在JQuery UI中你只需:
<div id="my-dialog">Interval: <span id="counter">0</span></div>
// Configure the div as dialog, call this only once
$("#my-dialog").dialog({modal:true,
autoOpen: false,
buttons: {
Ok: function() {
$( this ).dialog( "close" );
}
}
});
var counter = 0;
var intervalID = setInterval(function() {
// Update counter info
$("#count").html(++counter);
// Show dialog
$("#my-dialog").dialog("open");
}, 1000);
答案 1 :(得分:1)
根据您需要支持的浏览器(选中browser compatibility),您可以使用WebWorkers在并行线程中执行脚本。您只需将代码拆分为单独的文件,以便在工作线程中运行的代码位于其自己的文件中。调整您的示例而不需要了解工作人员的详细信息,您可以设置包含以下代码的文件worker.js
:
// file worker.js
var counter = 0;
setInterval(function(){
console.log("Interval: " + ++counter);
// The worker will live until you kill it.
if (counter > 100) self.close();
}, 1000);
然后,您的主JavaScript文件将设置新工作程序,使其在单独的工作线程中运行。
// Set up the new worker in a separate thread.
var worker = new Worker("worker.js");
setTimeout(function(){
// This will not stop the worker from logging to console.
alert("Some alert message");
},10000);
因此,主线程中的alert()
将不会停止执行工作线程,这将继续记录到控制台。
有关现场演示,请参阅此Plunk。