在Web工作程序仍在运行时向其发布消息

coo*_*t29 5 javascript multithreading asynchronous interrupt web-worker

假设我们有一个Web工作者引用一个名为"worker.js"的文件.我们使用worker在"worker.js"中执行一个执行一些冗长操作的函数.我们将相应的消息发布给工作者并在主线程中继续.但是,在工作人员完成初始工作之前,主线程会向其发送另一条消息.

我的问题:工人是否会继续我们的计时功能,只会在完成后处理新发布的消息,还是会中断当前的操作,直到新的消息完成为止?

coo*_*t29 5

我已经在Google Chrome浏览器的调试器中尝试了以下代码:

worker.js:

var cosine;
self.onmessage = function(e) {
    if (e.data.message == 0) {
        for (var i = 0; i < 10000000; i++) {
            cosine = Math.cos(Math.random());
            if (i % 1000 == 0) console.log("hello world");
        }
    } else if (e.data.message == 1) {
        console.log("xyz");
    }
};
Run Code Online (Sandbox Code Playgroud)

main.js:

var worker;

function main() {
    worker = new Worker("js/worker.js");
    worker.postMessage({message: 0});
    setTimeout(xyz, 10);
}

function xyz() {
    worker.postMessage({message: 1});
}
Run Code Online (Sandbox Code Playgroud)

输出:

(10000 times) test.js:11 hello world
test.js:14 xyz
Run Code Online (Sandbox Code Playgroud)

每次新的迭代都会重新计算余弦变量,以提供问题中所述的“耗时”算法。显然,仅在上一次操作完成后才收到该消息,因为我观察到在第10000个“ hello world”输出之后立即打印“ xyz”输出。