【发布时间】:2022-01-05 16:30:36
【问题描述】:
我想让Javascript同时运行两个操作。
我想让 javascript 在运行 interval 的同时处理一个大的 loop 来做一个计时器。
我在网上搜索,发现我们只有两种方法,要么使用event loop,要么使用web worker。
我已经为此苦苦挣扎了很长时间,但我很清楚如何真正使用web worker或event loop。
对于event loop,我无法真正理解它提供的文档的代码:
while (queue.waitForMessage()) {
queue.processNextMessage()
}
queue 代表什么?如果我在代码中直接使用queue,它将显示queue is not defined
另外,我怎么能在我的代码中实际使用它?
对于web worker,这是我的代码:
let result = document.getElementById('result')
let time = document.getElementById('time')
let worker;
let script = document.getElementsByTagName('script')
let interval = setInterval(function(){
time.textContent = parseFloat(time.textContent)+1
},1000)
function display(){
for(let i =0;i<10000;i++){
result.innerHTML +=i
}
}
let startworker = function(){
if(typeof(worker)=='undefined'){
worker = new Worker(script);
//I think this will produce error, but I don't know how to deal with the onmessage to let it run the function
worker.onmessage = function(){
display();
}
}
}
<div id='result'></div>
<button onclick='startworker()'>Click</button>
<div id='time'>0</div>
button,它将产生failed to construct 'Worker'。另外,对于onmessage 部分,我真的不知道如何让它运行loop,我认为我的代码不正确。
我已经阅读了很多文章和文档,但我仍然不知道该怎么做。
谁能帮助我理解这两种方法并给我一个更好的方法来解决这种情况?
感谢您的任何回应并原谅我的无知!!!
例子:
let result = document.getElementById('result')
let time = document.getElementById('time')
let interval;
function start(){
interval = setInterval(function(){
time.textContent = parseFloat(time.textContent)+1
},1000)
setTimeout(reallystart(),0)
}
function reallystart(){
for(let i =0;i<10000;i++){
if(i == 9999){
window.clearInterval(interval)
}
result.innerHTML +=i
}
}
<button onclick='start()'>Click</button>
<div id='result'></div>
<div id='time'>0</div>
【问题讨论】:
-
您提供的事件循环代码 sn-p 是浏览器代码的一部分,而不是您的。目的是说明事件处理是如何在幕后工作的。同时运行一堆间隔时间会看到添加到队列中和从队列中删除的事件。它还说明了为什么有些事情不会在您想要的时候发生 - 仍然有未处理的消息积压..
-
我不知道你想做什么。并行运行意味着您同时运行它们,然后等待它们全部完成然后再次运行。无论如何,我认为您需要的是异步并行功能。如果您通过更好的示例提供有关您的代码的更多信息会更好地理解。
-
@pfndesign,我希望在处理函数时运行计时器
-
@jackssmith 它只是您每个流程的计时器的一个计时器吗?您可以运行一个间隔,然后检查进程是否正在使用变量运行,如果没有运行,则删除计时器
-
@jackssmith - 您能详细说明什么这两件事是您想同时做的吗?如果你真的需要同时做一些事情,使用 WebWorker 似乎是可行的方法,因为每个工作人员都有自己的线程。而使用消息队列使用单个线程来等待和处理消息 - 同时结束的两个超时将一个接一个地处理。
标签: javascript web-worker event-loop