web-dev-qa-db-ja.com

promiseを使用しない場合

Es6の約束がどれほど素晴らしいか、そしてなぜそれらを実装する必要があるかについての数十の記事を読んだ後、私は[〜#〜] all [〜#〜]私の(自明ではない)javascript関数はpromiseである必要があります。

実際、Doomの三角形を避け、明確で簡潔なコードを取得しているように見えるので、それらを使用してコードを作成するときはとても気分がいいです。 (これにより、実行に関する推論がはるかに簡単になります)。

私が見つけられなかったのは、いつ[〜#〜] not [〜#〜]promiseを使用するのですか?いつ使用を避けるのですか?

更新:

APIの一貫性のようないくつかの素晴らしい点を見てきましたが、確かなNOケースはまだ見つかりません。 Luxの回答は、繰り返し発生するコールバックはpromiseと互換性がないため、イベントエミッターをフェッチする操作はそれらを回避する必要があることを示唆しています。しかし、今のところ(正しいように)それをチェックするための答えはまだ実質的に不足しているように感じます。

15
MSB

いくつかの経験則:

  1. メソッドを同期(単純なデータ変換)できる場合は、そのメソッドで同期コードを使用します。

    ただし、メソッドが同期時々、非同期時々(内部または外部の状態に基づく複数のコードパス)である場合は、非同期である常に。そうしないと、複雑なシナリオでのコードの動作に予期しない微妙な不一致が発生する可能性があるため、2つの態度を混同しないようにすることをお勧めします。

    [編集]コメントで述べたように、あなたのメソッドが今のところ同期しているが、将来のある時点で非同期作業を行う必要があるかもしれないと強く信じている場合、コストのかかるリファクタリングを避けるために最初からpromiseを使用することをお勧めします。

  2. 一般に、APIは一貫している必要があるため、どこでもpromiseを使用するか、どこでもコールバックを使用するのが最善です。これにより、コードについての推論が容易になります。

  3. 超高性能コードを記述している場合やメモリフットプリントを低くする必要がある場合は、promiseではなくコールバックを使用するか、ネイティブの代わりに bluebird などのパフォーマンスに重点を置いたpromiseライブラリを使用することを検討してください。 Promiseの実装/一般的なユースケースのポリフィル。

  4. [編集]とにかく、グローバル fetch 関数のようなWebプラットフォームへの新しい追加は、Promiseを返します。今後、ますます多くのブラウザ組み込みが登場するようです。約束に基づいて動作します。したがって、最新のコードを記述したいのであれば、約束を逃れることはできません。

17
jakub.g

ワンショット非同期操作にはpromiseを使用します。操作を開始し、操作を実行し、呼び出し元に完了または結果またはエラーを通知してから、永久に実行します。

promiseを使用しない状況は、上記とは異なる状況です。

  1. 操作または機能が完全に同期の場合。非同期APIを(promiseを使用しても)同期操作に配置すると、必要以上に複雑になります。
  2. イベントの代わりに複数回発生する可能性があります。たとえば、ボタンクリックハンドラーのpromiseは使用しません。 eventEmitterまたはその他のイベントのような構造は、繰り返し発生するイベントに適した構造です。
  3. コールバックが複数回呼び出されるように設計されている(進行状況の報告やコールバックを介したプラグインサービスの提供など)であるコールバック状況がある場合。
  4. すでに他の方法で設計されているAPIに1つの新しい操作を追加する場合(たとえば、従来のコールバックを使用)、APIの一貫性が必要です。
  5. 古い環境をターゲットにしている Promises(古いブラウザなど)をネイティブにサポートしておらず、コードのダウンロードサイズを最適化しようとしていて、1つまたは2つの非同期操作のみを実行している場合jQueryやAngularのようなものを使用しておらず、それはすでに使用できるpromiseの形式が組み込まれています。大量の非同期作業を行っている場合は、 Promisesポリフィルを使用する価値がある可能性が高いため、このポイントは、サイズが非常に重要であり、非同期作業がほとんどない場合にのみ当てはまります。
  6. 状況の場合アクションが終了または発生しないことが多い場合。 Promiseは状態のあるオブジェクトであるため、メモリを消費します。何千ものPromiseを作成して、通常は発生しないさまざまなことの通知を受け取ることは意味がありません。これは、ほとんど使用されない何千ものPromiseオブジェクト(通常はそれに付随するクロージャを含む)を作成するためです。これは単に非効率的なメモリ使用量であり、おそらく何らかのイベント通知によってより適切に処理されます。上で述べたように、promiseは、操作を開始し、操作を実行し、呼び出し元に結果またはエラーを通知するときに最も効果的に機能します。
9
jfriend00

ウェルプロミスには1つのユースケースがあります。1回だけ来る非同期結果です。

結果を同期して返すことができ、イベントが複数回発生する可能性があるため、イベントのコールバックが必要な場合は、Promisesを使用しません。

6
Lux

コードをブラウザ(Promisesが組み込まれていない可能性があります)で実行し、サイズ[〜#〜]本当に[〜#〜]が重要な場合は、Promisesを使用しないことを決定できます。 Promiseシム/ライブラリを使用する余裕はありません。

1
lipp

ほとんどの場合、promiseは、さまざまなタスクを簡単に処理することに慣れています。スレッドの過負荷を回避するために、意図的に非同期にするためにいくつかのことを行うことがあります。タブごとに1つのスレッドしかありません。小さいものやWebWorkerで作成できるものの場合はpromiseを使用する必要はありません。

1
Georgi Naumov