ホームページ » コーディング » JavaScriptプロミス入門

    JavaScriptプロミス入門

    非同期コード あるタスクを実行するのに便利です。 時間がかかる しかし、もちろん、それは 短所がない. 非同期コードの用途 コールバック関数 結果を処理するため、ただしコールバック関数 値を返すことはできません 典型的なJavaScript関数は.

    したがって、彼らは私たちの能力を奪うだけではありません 機能の実行 しかしまた作る エラー処理 少し面倒です。これはどこです 約束する それはの一部を埋めることを目的としているので、入ってくる 非同期コーディングの穴.

    約束する 技術的には 標準内部オブジェクト JavaScriptでは、つまり JavaScriptに組み込み. それを表すために使用されます 非同期コードブロックの最終結果 (またはコードが失敗した理由)そしてを制御するためのメソッドがあります 非同期コードの実行.

    構文

    作成できます のインスタンス 約束する を使用して 新しい キーワード:

     new Promise(機能(解決、拒否)); 

    関数 パラメータとして渡される約束する() コンストラクタは エグゼキュータ. それは非同期コードと の2つのパラメータがあります 関数 タイプ, と呼ばれる 解決する そして 拒否する 関数(これらの詳細は後で).

    の状態 約束する

    初期状態約束する オブジェクトが呼び出されます 保留中. この状態では、非同期計算の結果 存在しない.

    初期保留状態は次のように変わります。 成し遂げた 計算が行われるときの状態 成功した. の 計算結果 この状態で利用可能です.

    非同期計算の場合 失敗する, の 約束する オブジェクトが 拒否されました 初期からの状態 保留中 状態。この状態では、 計算失敗の理由 (すなわちエラーメッセージ)が利用可能になります.

    から行く 保留中成し遂げた 状態, resolve() と呼ばれる. から行く 保留中拒否されました 状態, 拒否() と呼ばれる.

    それから そして キャッチ 方法

    とき状態 からの変更 保留中成し遂げた, のイベントハンドラ 約束する オブジェクトの それから 方法 実行されます。そして、状態が からの変更 保留中拒否されました, のイベントハンドラ 約束する オブジェクトの キャッチ 方法 実行されます.

    例1

    “約束されていない” コード

    あると仮定 hello.txt を含むファイル “こんにちは” ワード。以下にAJAXリクエストを書く方法を示します。 そのファイルを取得する そして その内容を表示する, 使用せずに 約束する オブジェクト:

     function getTxt()let xhr = new XMLHttpRequest(); xhr.open( 'GET'、 'hello.txt'); xhr.overrideMimeType( 'text / plain'); xhr.send(); xhr.onload = function()try switch(this.status)case 200:document.write(this.response);ブレーク;ケース404:「ファイルが見つかりません」をスローするデフォルト値: 'ファイルの取得に失敗しました'をスローします。 catch(err)console.log(err); getTxt(); 

    ファイルの内容が 正常に取得されました, すなわち. 応答ステータスコードは200です。, 応答テキストは 文書に書かれている. ファイルが 見つかりません(ステータス404), ある “ファイルが見つかりません” エラーメッセージが表示されます。そうでなければ、 一般的なエラーメッセージ ファイルの取得に失敗したことを示す.

    “約束された” コード

    それでは、ましょう 上記のコードを宣伝する

     function getTxt()新しいPromise(関数(解決、拒否))を返すxhr = new XMLHttpRequest(); xhr.open( 'GET'、 'hello.txt'); xhr.overrideMimeType( 'text / plain'); xhr.send(); xhr.onload = function()switch(this.status)ケース200:解決(this.response);ケース404:拒否( 'ファイルが見つかりません');デフォルト:拒否( '失敗)ファイル ');;);を取得します。 getTxt()。then(関数(txt)document.write(txt);)。catch(関数(err)console.log(err);); 

    getTxt() 関数は今ではコーディングされています の新しいインスタンスを返します 約束する, そしてそのexecutor関数は以前からの非同期コードを保持します.

    ときに 応答ステータスコードは200, の 約束する です 成し遂げた によって 呼びかけ resolve() (応答はのパラメータとして渡されます。 resolve())ステータスコードが404またはその他の場合、 約束する です 拒否されました 使う 拒否() (パラメータとして適切なエラーメッセージを 拒否()).

    のイベントハンドラ それから() そして キャッチ() 方法約束する オブジェクトは 最後に追加.

    ときに 約束する です 成し遂げた, のハンドラ それから() メソッドが実行されます。その議論は から渡されたパラメータ resolve(). イベントハンドラの内部では、応答テキスト(引数として受け取ったもの)は 文書に書かれている.

    ときに 約束する です 拒否されました, のイベントハンドラ キャッチ() メソッドが実行されます, エラーを記録する.

    主な利点 コードの上記の約束されたバージョンの エラー処理. 「約束されていない」バージョンのように、「捕捉されていない例外」を投げる代わりに、 適切な失敗メッセージ 返されてログに記録される.

    しかし、それだけではありません 帰る失敗メッセージ だけでなく 非同期計算の結果 それは私たちにとって本当に有益なことです。それを見るために、私達は私達の例を拡大する必要があるでしょう.

    例2

    “約束されていない” コード

    からのテキストを表示するだけでなく hello.txt, したい と組み合わせる “世界” ワード そしてそれを画面に表示する 2秒のタイムアウト後. これが私が使うコードです:

     function getTxt()let xhr = new XMLHttpRequest(); xhr.open( 'GET'、 'hello.txt'); xhr.overrideMimeType( 'text / plain'); xhr.send(); xhr.onload = function()try switch(this.status)case 200:document.write(concatTxt(this.response));ブレーク;ケース404:「ファイルが見つかりません」をスローするデフォルト値: 'ファイルの取得に失敗しました'をスローします。 catch(err)console.log(err); 関数concatTxt(res)setTimeout(function()return(res + 'World')、2000); getTxt(); 

    ステータスコード200では、 concatTxt() 関数が呼び出される 応答テキストを “世界” ワード 文書に書き込む前に.

    しかし、このコード 望みどおりに動作しない. の setTimeout() コールバック関数 連結文字列を返すことはできません. 文書に印刷されるものは 未定義 それが concatTxt() 戻る.

    “約束された” コード

    それで、コードを機能させるために、ましょう 上記のコードを宣伝する, 含む concatTxt()

     function getTxt()新しいPromise(関数(解決、拒否))を返すxhr = new XMLHttpRequest(); xhr.open( 'GET'、 'hello.txt'); xhr.overrideMimeType( 'text / plain'); xhr.send(); xhr.onload = function()switch(this.status)ケース200:解決(this.response);ケース404:拒否( 'ファイルが見つかりません');デフォルト:拒否( '失敗)ファイル ');;);を取得します。 function concatTxt(txt)return新しいPromise(関数(解決、拒否))setTimeout(function()resolve(txt + 'World');、2000););  getTxt()。then((txt)=> return concatTxt(txt);)。then((txt)=> document.write(txt);)。catch((err)=> console log(err);); 

    と同じように getTxt(), の concatTxt() 機能も 新しいを返します 約束する 連結テキストの代わりに。の 約束する によって返された concatTxt() です のコールバック関数内で解決 setTimeout().

    上記のコードの終わり近くで、最初のイベントハンドラ それから() メソッドは 約束するgetTxt() です 成し遂げた, つまり、ファイルが 正常に取得されました. そのハンドラの中, concatTxt() と呼ばれる そしてその 約束する によって返された concatTxt() 返される.

    2番目のイベントハンドラ それから() メソッドは 約束する によって返された concatTxt() です 成し遂げた, すなわち 2秒のタイムアウトが終了しました そして resolve() と呼ばれる 連結文字列をパラメータとして.

    最後に, キャッチ() すべての例外と失敗メッセージをキャッチします。 両方の約束から.

    このPromisifiedバージョンでは、 “こんにちは世界” 文字列は 正常に印刷された ドキュメントへ.