Javascript 我可以在web worker中存储本地状态吗

Javascript 我可以在web worker中存储本地状态吗,javascript,web-worker,Javascript,Web Worker,我正在学习javascript中的网络工作者,使用VSCode。我的工作者在其onmessage事件期间设置间隔。理想情况下,调用start只会在间隔尚未运行时创建间隔 onmessage = (event: MessageEvent) => { let interval; switch (event.data.command){ case "start": if (!interval){ interval = setInt

我正在学习javascript中的网络工作者,使用VSCode。我的工作者在其
onmessage
事件期间设置间隔。理想情况下,调用start只会在间隔尚未运行时创建间隔

onmessage = (event: MessageEvent) => {
  let interval;

  switch (event.data.command){
    case "start":
      if (!interval){
        interval = setInterval(myFunction, 1000);
      }
      break;
    case "stop":
      if (interval){
        clearInterval(interval);
        interval = null;
      }
      break;
  }
}
问题是
interval
在函数的执行过程中被定义,因此我可以启动多个interval,而其中任何一个都不知道彼此

const worker = new Worker("myworker.ts");
worker.postmessage({command: "start"});
worker.postmessage({command: "start"});
worker.postmessage({command: "start"});
如果我修改web worker代码以使用全局变量(如下所示),则根据VSCode,其他worker文件将可以访问interval变量:

let interval; // Error: `interval` is already defined in `anotherWorker.ts`

onmessage = () => {
  // ...
  if (!interval){
    interval = setInterval(myFunction, 1000);
  }

  // ...
  if (interval){
    clearInterval(interval);
    interval = null;
  }
}
即使每个worker都有自己的作用域,如果我跨worker重用变量名,VSCode也会继续抛出错误


如何为worker
onmessage
函数创建本地状态?

您可以将
onmessage
处理程序包装在自己的块中,并在其中声明您的
间隔。这样,其他模块将看不到它,但它仍将在不同的消息事件中保持

{ // <- defines a new block
  let interval; // <- only for us, but still the same for all message events

  onmessage = () => {
    // ...
    if (!interval){
      interval = setInterval(myFunction, 1000);
    }

    // ...
    if (interval){
      clearInterval(interval);
      interval = null;
    }
  };
}

{/您可以将您的
onmessage
处理程序包装在它自己的块中,并在那里声明您的
间隔。这样,其他模块将看不到它,但它仍将在不同的消息事件中保持

{ // <- defines a new block
  let interval; // <- only for us, but still the same for all message events

  onmessage = () => {
    // ...
    if (!interval){
      interval = setInterval(myFunction, 1000);
    }

    // ...
    if (interval){
      clearInterval(interval);
      interval = null;
    }
  };
}

{//谢谢!我花了几天时间做其他事情,但一旦我开始测试,我可能会接受它作为正确答案。谢谢!我花了几天时间做其他事情,但一旦我开始测试,我可能会接受它作为正确答案。