web-dev-qa-db-ja.com

JavaScript Webワーカー-close()とterminate()

Webワーカーのclose()メソッドとterminate()メソッドの違いを完全には理解していません。私はここで説明を読みました、そしてそれは同じことをしているようです?? http://www.w3.org/TR/workers/

どちらを使用するのですか?

19
John Lee

close()メソッドは、ワーカーのスコープ内で表示されます。 terminate()メソッドはワーカーオブジェクトのインターフェイスの一部であり、「外部から」呼び出すことができます。

メインスクリプトでワーカーを作成し、そのスクリプトからワーカーを停止する場合は、ワーカーオブジェクトでterminate()を呼び出す必要があります。 (外部メッセージへの応答などとして)ワーカーコードからワーカーを停止する場合は、close()メソッドを呼び出す必要があります。

ソース: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Terminating_a_worker

45

実際、close()関数はワーカーのスコープ内から表示されます。

terminate()は外部から可視です(つまり、ワーカーを呼び出すスクリプトは、この関数を使用してシャットダウンできます)

TBHこれは最初は少し混乱しますが、実装すると慣れます

1

終了よりもself.close()の良いユースケースを見つけました。 Webワーカーの内部には、オブジェクトの位置を受け取ってポストバックするsetInterval関数がありました。 terminateを使用するとWebワーカーが完全に強制終了されるため、playメッセージをワーカーに送信できませんでした。それを閉じている間、私はそれを再び開いてタイマーを再起動しました。

0
William Hammock

ReactでWebワーカーを使用する場合のその他の違い:

  1. terminateを使用する場合、APIを呼び出すだけで、synchronousになります。
  2. closeを使用する場合は、postMessageを呼び出してシグナル/メッセージを送信し、ワーカーがスコープ内で自分自身を強制終了できるようにする必要があります。 postMessageは、私が知る限り、NOT同期です。

closeの問題は、コンポーネントをunmountするときにワーカーを強制終了したい場合は、それを実行する必要があるsynchronouslyです。それ以外の場合は、may get警告、特にComponentWillUnmountライフサイクルフックまたはuseEffectフック内のものをクリーンアップしようとした場合(そうでない場合、ゾンビWebワーカーインスタンスが複数存在します)。

警告は次のようになります。

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.

または:

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.

0
Yumin Gui