1.1 コールバック関数
コールバック関数: 関数 A をパラメータとして渡して別の関数 B を呼び出すと、A がコールバック関数になります。 [推奨: JavaScript ビデオ チュートリアル]
コールバックという名前のいくつかの例
function あなたは犬を何匹飼っていますか(fn){ fn('犬') }関数 count Dog(数値){ console.log(数量) } あなたは犬を何匹飼っていますか (犬を数えます) // 犬 1 匹
匿名コールバック
function あなたは犬を何匹飼っていますか(fn){ fn('犬') } あなたは犬を何匹飼っていますか (function(number){console.log(number) }) // 犬
よくある例
jQuery ではコールバック関数が使用されますが、ここでは匿名コールバックが使用されます。
$("#btn").click(function(){ console.log('クリックしてください') })
1.2 コールバック地獄(コールバックのデメリット1)
コールバック地獄: コールバックが入れ子になりすぎて、コードが理解しにくくなる状況を指します。
let info = []function あなたは犬を何匹飼っていますか(fn){ fn('犬') }関数 あなたは猫を何匹飼っていますか(fn){ fn('猫') }関数は知っています(数量,コールバック){ info.push(数量) console.log(情報) if(コールバック){ 折り返し電話() } }//呼び出しを開始します。これよりいくつかの階層があると、犬の数を把握するのが難しくなります (function(犬の数){ console.log(犬の数) わかりました(犬の数, function(){ あなたは猫を何匹飼っていますか(関数(猫の数){ console.log(猫の数) わかりました(猫の数) }) }) })
1.3 Promiseを使用せずに問題を解決する方法
匿名関数の代わりに名前付き関数を使用する
let info = []function あなたは犬を何匹飼っていますか(fn){ fn('犬') }関数 あなたは猫を何匹飼っていますか(fn){ fn('猫') }関数は知っています(数量,コールバック){ info.push(数量) console.log(情報) if(コールバック){ 折り返し電話() } }関数は猫の数を教えてくれます(猫の数){ console.log(猫の数) わかりました(猫の数) }関数はカウントを継続します(){ あなたは猫を何匹飼っていますか(猫の数を教えてください) }関数は犬の数(犬の数)を示します{ console.log(犬の数) わかりました (犬の数、数え続けてください) } あなたは犬を何匹飼っていますか (犬の数を教えてください) // あまり良くないようです。 。 。
1.4 コールバック メソッドは異なるため、個別に覚える必要がある (コールバックの欠点 2)
readFile('C:\1.txt',function (error, data) { // node.js のコールバック ファイル読み取りメソッド if(error) { console.log('成功') console.log(data.toString()) } それ以外 { console.log('ファイルの読み取りに失敗しました') } }) $.ajax({ //jQuery の ajax メソッドのコールバック url:'/2.txt' 成功: 関数(応答) { console.log('成功') }、 エラー: function(){ console.log('失敗') } })
Promise は、従来のソリューション (コールバックやイベント) よりも合理的かつ強力な非同期プログラミングのソリューションです。これは最初にコミュニティによって提案および実装され、ES6 がそれを言語標準に組み込み、その使用法を統一し、Promise オブジェクトをネイティブに提供しました。
3.1 実装原理
ES6 では、Promise オブジェクトは Promise インスタンスを生成するために使用されるコンストラクターであると規定されています。関数内で Promise オブジェクトのインスタンスを返すことにより、次のステップで Promise のプロパティとメソッドを使用できます。
function 関数名(){ return new Promise(function(resolve, accept) { // ... いくつかのコード if (/* 非同期操作が成功しました */){ solve(value); // 非同期操作が成功したときに呼び出され、結果をパラメータとして渡します } else { 拒否(error); // 非同期エラーが発生したときに呼び出され、エラーをパラメータとして渡します } }) }
3.2 呼び出しロジック
S1 も E1 もエラーを報告しませんでした。S2 を実行します (実行を解決すると、システムは完了したと判断し、エラーは報告されません)
S1 または E1 のいずれかがエラーを報告した場合、E2 を実行します (実行が拒否され、システムは実行が完了していないと判断し、エラーを報告します)
フロントエンド (vue) マスタリーコースへのエントリー: ラーニングに入る
4.1 Promiseのプロパティとメソッド
財産
Promise.prototype は、Promise コンストラクターのプロトタイプ メソッドを表します。
Promise.prototype.then()
約束を返します。 Promise の成功コールバック関数と失敗コールバック関数の、最大 2 つのパラメータが必要です。
Promise.prototype.catch()
Promise を返し、拒否を処理します。 Promise.prototype.then(未定義、onRejected) と同等
Promise.prototype.finally()
finally() メソッドは Promise を返します。 then() と catch() の実行後、finally で指定されたコールバック関数が実行されます。 then() と catch() で同じステートメントを 1 回記述する必要がある状況を避けます。
Promise.all(反復可能)
Promise インスタンスを返します。反復可能なパラメーター内のすべての Promise が解決された後、コールバックは解決を完了します。
Promise.race(反復可能)
反復可能内に「解決」または「拒否」する Promise オブジェクトがある限り、Promise オブジェクトの戻り値または拒否のエラー理由を伴う Promise を返します。
Promise.resolve()
指定された値で解決される Promise オブジェクトを返します。ただし、この値が thenable である場合 (つまり、then メソッドを使用している場合)、返される Promise は thenable オブジェクトを「フォロー」し、受信値自体が次の場合はその最終状態 (解決済み、拒否済み、保留中、解決済みを参照) を採用します。 Promise オブジェクトの場合、そのオブジェクトは Promise.resolve メソッドの戻り値として返されます。それ以外の場合は、Promise オブジェクトがこの値とともに成功ステータスとして返されます。
Promise.reject()
拒否の理由パラメータを含む Promise オブジェクトを返します。
4.2 コールバック地獄の例を Promise 形式に書き換える
Promise を使用すると、ロジックが非常に直感的になり、より完全に記述できるようになったことがわかります。
Promise が Promise 内にネストされている場合、つまり Promise がチェーンされている場合、Promise チェーンを使用する場合、各ステップで前のステップからのデータが必要な場合は、パラメータがリゾルブに正常に渡される必要があります。パラメータが失敗した場合、パラメータを渡し忘れると、期待した結果が得られません。
solve は成功したデータを次のコールバックに返します。
Reject は失敗したデータを次のコールバックに返します。
ここで解決するパラメータを渡し、それを失敗の例に変更します。最初に拒否するパラメータを渡さないでください。失敗した場合、次のコールバックはデータを取得しません。
拒否するパラメータを渡す
失敗コールバックが渡されても、デフォルトではunknown()が返されるため、成功と失敗の両方が処理された場合と同じように、次の成功コールバックが実行されることがわかります。次のコールバックが実装されます。
これを期待どおりに変更します。つまり、失敗した場合には呼び出されません。
失敗を呼び出さないための短縮形
上記の状況が実行された後、.then の成功コールバック (犬を除く) が実行されないことを確認するために失敗コールバックを追加してみましょう。
また、後続の成功したコールバックを実行できるように、resolve を返すこともできます。
4.3 アプリケーション
イメージをロードすると、イメージのロードが Promise として書き込まれます。ロードが完了すると、Promise の状態が変わります。
const preloadImage = 関数 (パス) { return new Promise(function (解決、拒否) { const image = 新しい画像(); image.onload = 解決; image.onerror = 拒否; 画像.src = パス; }); };
Generator 関数と Promise の組み合わせ (詳細は参考リンク、Ruan Yifeng のチュートリアルを参照)
5.1 待つ
成功例
失敗した場合は try catch を使用する
await を try catch とともに使用すると、より完全になります。
Promise オブジェクトを使用すると、通常の関数を Promise を返す形式に変更して、コールバック地獄の問題を解決できます。
Promiseの成功・失敗呼び出しロジックを理解し、柔軟に調整できます。
核となる知識を理解し、まずそれを使用し、ゆっくりと知識を統合して吸収します。
以上がES6 Promiseの原理と活用事例分析の詳細な内容でした!