Promiseとあなたが知らないかもしれない6つのことについて
2411 ワード
前言
Promiseは非常にシンプルな概念です.Promiseを使う機会がなくても、Promiseに関する文章を読んだことがあります.
Promiseとは
Promiseとは、非同期動作のメッセージを伝達するための
Promiseの役割
Promiseの出現は主に地狱回調
基本的なアプリ Promise.resove() Promise.reject() Promise.prototype.then() Promise.prototype.ctch() Promise.all()/すべての完了 Promise.all([p 1,p 2,p 3]) Promiseの価値は,非同期関数の入れ子によって混乱しているのではなく,非同期コードをより読み取り可能なスタイルで構成することにある.次に6つのあなたが知らないかもしれないPromiseについて触れます.
最初に列挙する前に、どうPromiseを作成するかを見てみます.
1、then()はforked Promiseに戻ります.
まず次の二つのコードの違いを見てください.
この2つのコードが等価であると考えているならば、
2、コールバック関数は結果を伝えるべきです.
下のコードはどうなりますか?alertがハローワールドを出ると勘違いしていませんか?しかし、alertが出てきたのは確かにundefinedです.その理由は上にも述べました.チェーン式の書き方の文脈では、次の
3、上のレベルからの異常を捕獲するしかない.
もう2つのコードを見てください.何か違いがありますか?
Aにおいて、最初のthenが異常を投げた時、第二のthenはこの異常を捉えて、''ああ、間違った''をイジェクトすることができます.これは前のレベルの異常からのみ捕獲される規則と一致している.Bでは、正確なコールバック関数とエラーのコールバック関数が同じレベル、つまり、コールバックで異常を投げたにもかかわらず、この異常は捕獲されない.実際には、Bの中のエラーリカバリーは、プロミセがrejectiedまたはpromise自身に異常を投げられた時にのみ実行されます.
4、エラーが回復されます.
一つのエラーが壊れてしまいました.もう一度ミスを投げ直していないと、プロミスは回復したと思います.プロミスの状態は
5、Promiseは停止されます.
あなたがすでに一つのthen関数でコードを実行しているだけで、プロミスを一時停止して他のことをすることができないという意味ではありません.現在のプロミスを一時停止するために、または他のプロミスが完了するまで待つ必要があります.簡単にthen関数で別のプロミスを返します.上のコードでは、新たなプロミセの状態がresoloved解析されるまで、alertが表示されます.既に存在している非同期コードにより多くの依存性を導入するには便利な方法である.例えば、ユーザセッションがタイムアウトしていることが分かります.したがって、後のコードを実行する前に第二のログインを開始したいかもしれません.
6、resoloved状態のPromiseはすぐに実行されません.
最後の栗を見に来てください.次のコードを実行したら何が出ますか?
最初の目は2のように見えませんでした.プロミスはすでにresolovedですので、then()はすぐに実行します.しかし、プロミセ仕様の要求はすべてのフィードバックが非同期であるため、alert実行時のiの値はまだ修正されておらず、値は依然として0である.
Promiseは非常にシンプルな概念です.Promiseを使う機会がなくても、Promiseに関する文章を読んだことがあります.
Promiseとは
Promiseとは、非同期動作のメッセージを伝達するための
である.これは、ある将来結果が分かるイベント(一般的には
)を表し、このイベントは、統一したAPIを提供し、さらに処理することができる.Promiseの役割
Promiseの出現は主に地狱回調
callback hell
の問題を解決することです.例えば、結果が必要であれば、多くのインターフェースを要求する必要があります.これらのインターフェースのパラメータは他のインターフェースから戻ってくるデータを依存として必要とします.基本的なアプリ
最初に列挙する前に、どうPromiseを作成するかを見てみます.
1、then()はforked Promiseに戻ります.
まず次の二つのコードの違いを見てください.
この2つのコードが等価であると考えているならば、
promise
は1次元のコールバック関数の配列にすぎないからかもしれない.しかし、この2つのコードは同等ではなく、thenを呼び出すたびにforked promise
に戻ります.したがって、Aでfunc 1に異常がある場合、func 2は同じように実行されます.Bではpromiseのチェーン表記, func1
の新しいpromise`.2、コールバック関数は結果を伝えるべきです.
下のコードはどうなりますか?alertがハローワールドを出ると勘違いしていませんか?しかし、alertが出てきたのは確かにundefinedです.その理由は上にも述べました.チェーン式の書き方の文脈では、次の
.then()
の中で動作するのは前に戻ってきた promise
です.プロミスはあなたのコールバック関数を期待しています.または同じ結果を返したり、他の結果を返したりしますが、次のコールバックに送られます.3、上のレベルからの異常を捕獲するしかない.
もう2つのコードを見てください.何か違いがありますか?
Aにおいて、最初のthenが異常を投げた時、第二のthenはこの異常を捉えて、''ああ、間違った''をイジェクトすることができます.これは前のレベルの異常からのみ捕獲される規則と一致している.Bでは、正確なコールバック関数とエラーのコールバック関数が同じレベル、つまり、コールバックで異常を投げたにもかかわらず、この異常は捕獲されない.実際には、Bの中のエラーリカバリーは、プロミセがrejectiedまたはpromise自身に異常を投げられた時にのみ実行されます.
4、エラーが回復されます.
一つのエラーが壊れてしまいました.もう一度ミスを投げ直していないと、プロミスは回復したと思います.プロミスの状態は
resolved
に変わります.次の栗に i am saved
がイジェクトされます.最初のthen()のエラーコール関数が注釈されています.Promiseはタマネギの皮層と見なされ、毎回thenを呼び出して皮層を追加します.各皮層は処理できる状態を表しています.皮層が処理された後、promiseは誤りを修復したと考えて次の皮層に入るつもりです.5、Promiseは停止されます.
あなたがすでに一つのthen関数でコードを実行しているだけで、プロミスを一時停止して他のことをすることができないという意味ではありません.現在のプロミスを一時停止するために、または他のプロミスが完了するまで待つ必要があります.簡単にthen関数で別のプロミスを返します.上のコードでは、新たなプロミセの状態がresoloved解析されるまで、alertが表示されます.既に存在している非同期コードにより多くの依存性を導入するには便利な方法である.例えば、ユーザセッションがタイムアウトしていることが分かります.したがって、後のコードを実行する前に第二のログインを開始したいかもしれません.
6、resoloved状態のPromiseはすぐに実行されません.
最後の栗を見に来てください.次のコードを実行したら何が出ますか?
最初の目は2のように見えませんでした.プロミスはすでにresolovedですので、then()はすぐに実行します.しかし、プロミセ仕様の要求はすべてのフィードバックが非同期であるため、alert実行時のiの値はまだ修正されておらず、値は依然として0である.