タイトルを次のように書き換えます: 既存のコールバック API を Promise フォームに変換する方法?
P粉268654873
2023-08-21 18:34:55
<p>Promise を使用して処理したいのですが、コールバック API の形式は次のとおりです。 </p>
<h3>1. DOM ロードまたはその他の 1 回限りのイベント: </h3>
<pre class="brush:php;toolbar:false;">window.onload; // コールバック関数として設定
...
window.onload = function() {
};</pre>
<h3>2. 通常のコールバック関数: </h3>
<pre class="brush:php;toolbar:false;">関数リクエスト(onChangeHandler) {
...
}
リクエスト(関数() {
// かわった
...
});</pre>
<h3>3. ノードスタイルのコールバック関数 (「nodeback」): </h3>
<pre class="brush:php;toolbar:false;">function getStuff(dat, callback) {
...
}
getStuff("dataParam", function(err, data) {
...
})</pre>
<h3>4. ライブラリ全体でノード スタイルのコールバック関数が使用されます。</h3>
<pre class="brush:php;toolbar:false;">API;
API.one(関数(err, データ) {
API.two(function(err, data2) {
API.three(function(err, data3) {
...
});
});
});</pre>
<h3>Promise を使用してこの API を処理するにはどうすればよいですか?また、それを「約束」するにはどうすればよいですか? </h3>
今日、
Promise
をNode.js
の通常の Javascript メソッドとして使用できるようになりました。シンプルで基本的な
Promise
の例 (KISS メソッドを使用):通常Javascript非同期APIコード:
リーリー
リーリー約束
Javascript 非同期 API コード:(この優れた情報源 にアクセスすることをお勧めします)
さらに、Promise
同じコードを使用して、を
ES7の
async\awaitとともに使用して、プログラム フローを
fulfilledまで待機させることもできます。結果は次のようになります:
リーリー.then()
Promiseメソッドを使用できます。 リーリー
は、
ボーナスreact-native
などの Node.js ベースのプラットフォームでも使用できます。: ハイブリッドアプローチ (コールバック メソッドには 2 つのパラメータ、つまり error と result があると仮定します) リーリー
###お役に立てれば。上記のメソッドは、古いスタイルのコールバックと Promise の使用の結果に同時に応答できます。
Promise には状態があり、最初は保留状態であり、次のように解決できます。
プロミス を返す関数は、例外 をスローせず、拒否を返す必要があります。 Promise を返す関数から例外をスローすると、
} catch {
と.catch
の両方を使用する必要があります。 Promise ベースの API を使用している人は、Promise が例外をスローすることを望んでいません。 JS の非同期 API がどのように機能するかわからない場合は、まず この回答を確認してください。1. DOM ロードまたはその他の 1 回限りのイベント:
したがって、Promise を作成するということは、通常、Promise がいつ解決されるかを指定することを意味します。つまり、データが利用可能である (および
.then
を使用してアクセスできる) ことを示すために、いつ Fulfilled または Rejected ステージに移行するかを指定することになります。
リーリーPromise
コンストラクター (ネイティブ ES6 Promise など) をサポートする最新の Promise 実装を使用します:その後、生成された Promise を次のように使用できます:
リーリー遅延をサポートするライブラリを使用します (ここでは例として $q を使用しますが、後で jQuery も使用します):
リーリーまたは、jQuery に似た API を使用して、発生するイベントをフックします:
リーリー2. 通常のコールバック:
JS ではコールバックが一般的であるため、これらの API は非常に一般的です。一般的なケースの
onSuccess
とonFail
を見てみましょう。 リーリーPromise
遅延をサポートするライブラリを使用します (ここでは例として jQuery を使用していますが、前に $q も使用しました):コンストラクター (ネイティブ ES6 Promise など) をサポートする最新の Promise 実装を使用します:
リーリーリーリー
jQuery は$.Deferred(fn)
resolveフォームも提供します。これには、次のように
new Promise(fn)フォームに非常に近い式を記述できるという利点があります。下に示された :### リーリー
注: ここでは、jQuery の遅延メソッドと
3. ノード スタイル コールバック (「nodeback」): Node スタイルのコールバック (ノードバック) には特定の形式があり、コールバックは常に最後のパラメーターであり、その最初のパラメーターはエラーです。まず手動で Promise に変換します:
リーリー ### に変換: ### リーリーreject
メソッドが「分離可能」である、つまり、jQuery.Deferred() のメソッドにバインドされているという事実を利用します。 ### 例###。すべてのライブラリがこの機能を提供するわけではありません。defer を使用すると、次のことができます (例として Q を使用しましたが、Q は現在新しい構文をサポートしています
その構文を使用することをお勧めします):
リーリー一般に、手動でものを Promise に変換しすぎないでください。Node 用に設計されたほとんどの Promise ライブラリと Node 8 のネイティブ Promise には、ノードバックを Promise に変換するためのメソッドが組み込まれています。例えば### リーリー
4. ライブラリ全体でノード スタイルのコールバックが使用されます:ここに黄金律はありません。それらを 1 つずつ約束に変換することができます。ただし、一部の Promise 実装ではこれをバッチで実行できます。たとえば、Bluebird では、ノードバック API を Promise API に変換するのは次のように簡単です。 リーリー または、
Nodeで
Native Promiseを使用します:
リーリー ###知らせ:###.then
ハンドラー内では、物事を Promise に変換する必要はありません。.then
ハンドラーから Promise を返すと、Promise の値を使用して解決または拒否されます。また、プロミスを拒否する.then
ハンドラーから例外をスローすることもお勧めします。これは、プロミススローの安全性として知られています。onload
の場合は、onX
の代わりにaddEventListener
を使用する必要があります。