web-dev-qa-db-ja.com

Webワーカーと約束

Webアプリをレスポンシブにするために、非同期の非ブロッキングリクエストを使用します。これを達成するための2つの方法を想像することができます。 1つは、据え置き/約束を使用することです。もう1つはWebワーカーです。 Web Workerを使用すると、別のプロセスが導入され、データを前後にマーシャリングする必要があるというオーバーヘッドが発生します。 Webワーカーよりも単純なノンブロッキングコールバックをいつ選択するかを理解するのに役立つ、ある種のパフォーマンスメトリックを探していました。

両方のアプローチのプロトタイプを作成せずに、どちらを使用するかを定式化する方法はありますか? Web Workersに関するチュートリアルをオンラインでたくさん見ていますが、成功/失敗の話はあまりありません。私が知っているのは、レスポンシブアプリが欲しいということだけです。ユーザーがクエリおよび更新できる0.5〜15 MB(基本的にはDB)の範囲のメモリ内データ構造へのインターフェイスとしてWebワーカーを使用することを考えています。

私がjavascript処理を理解しているので、1つの長時間実行タスクを取得してスライスし、他のタスクに処理時間のスライスを許可する制御を定期的に生成することができます。それはWebワーカーを使用するための兆候でしょうか?

21
Mario

`延期/約束とWebワーカーはさまざまなニーズに対応します。

  • Deferred/promiseは、まだ利用できない結果への参照を割り当て、結果が利用可能になるか失敗が返されたときに実行されるコードを編成するための構造です。

  • Web Workersは、実際の作業を非同期で実行します(プロセスではなく、オペレーティングシステムスレッドを使用するため、比較的軽量です)。

言い換えると、JavaScriptはシングルスレッドであるため、runコードを非同期的に実行するための遅延/約束を使用することはできません。実行されます(たとえば、setTimeout()を使用して実行の順序を変更できますが、それによってWebアプリ自体の応答性が向上するわけではありません)。それでも、たとえば、非同期クエリのような錯覚を作成できる可能性があります。インデックスを数ミリ秒ごとにインクリメントすることによって(たとえば、setIntervalを使用して)値の配列を反復処理しますが、それはほとんど実用的ではありません。

クエリなどの作業を非同期で実行し、この作業をアプリのUIからオフロードするには、実際に非同期で機能するものが必要です。いくつかのオプションがあります。

  • 非同期APIを提供する IndexedDB を使用します。

  • 独自のメモリ内データ構造を実行し、指定したようにWebワーカーを使用して実際のクエリを実行します。

  • NodeJS などのサーバーサイドスクリプトエンジンを使用してコードを実行し、クライアント側のajaxを使用してクエリを開始します(さらに結果を処理することを約束します)。

  • hTTP経由でアクセス可能なデータベース(Redis、CouchDBなど)を使用し、クライアントから非同期GET(ajaxなど)を発行してDBにクエリを実行します(さらに結果を処理することを約束します)。

  • たとえば、を使用してハイブリッドWebアプリを開発します。 解析

あなたの場合、どのアプローチが最適ですか?正確な要件がないとわかりませんが、これが私が見る寸法です。

  • コードの複雑さ—データ構造のコードがすでにある場合は、おそらくWebワーカーが適しています。そうでない場合は、IndexedDBの方が賢明に見えます。
  • パフォーマンス—一貫したパフォーマンスが必要な場合は、サーバー側の実装またはDBの方が適切と思われます
  • アーキテクチャ/複雑さ—すべての処理をクライアント側で実行する必要がありますか、それともサーバー側の実装を管理するための労力(コスト)を支払う余裕がありますか?

私は この本 役に立つ読み物を見つけました。

42
miraculixx