我并不完全理解Web Workers的close()和terminate()方法之间的区别。我已经阅读了这里的描述,它似乎在做同样的事情? http://www.w3.org/TR/workers/
我何时会使用其中一个?
答案 0 :(得分:39)
close()
方法在工作者范围内可见。
terminate()
方法是工作者对象接口的一部分,可以“从外部”调用。
如果在主脚本中创建一个worker并希望从该脚本中停止它,则应该调用worker对象上的terminate()
。如果要从工作程序代码中停止工作程序(例如,作为对外部消息的响应),则应调用close()
方法。
答案 1 :(得分:1)
在React中使用Web Worker时的其他区别:
terminate
,则只需调用api,它就是synchronous
close
,则需要调用postMessage
并发送信号/消息,以便工作人员可以在其作用域内杀死自己。据我所知,postMessage
是NOT
同步的。 close
的问题是,如果要在unmount
组件时杀死该工作程序,则需要synchronously
,否则,may
会得到一个警告,尤其是当您尝试清理ComponentWillUnmount
生命周期挂钩或useEffect
挂钩中的内容时(否则,将有多个处于活动状态的僵尸Web Worker实例)。
警告看起来像:
Warning: Can't call setState (or forceUpdate) on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
OR:
Warning: Can't perform a React state update on an unmounted component.
This is a no-op, but it indicates a memory leak in your application.
To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
答案 2 :(得分:0)
确实 close()函数可以在Worker的范围内看到。
从外部可以看到terminate()(即:调用worker的脚本可以使用此函数将其关闭)
TBH起初有点令人困惑,但一旦实施,你就会习惯它
答案 3 :(得分:0)
我发现终止时self.close()很好的用例。在我的网络工作者中,我有一个setInterval函数,该函数正在接收并回传对象位置。使用终止会永久杀死网络工作者,因此我无法将播放消息发送回该工作者。同时关闭它,让我重新打开它并重新启动计时器。