[JS Deep Dive]プログラム
9235 ワード
プロミスとは何ですか。
プロミス客体です
プロセスは、ECMAScript仕様で定義されている標準ビルダーオブジェクトです.
プロセスは、非同期処理のステータスと結果値を表すオブジェクトです.
ES 6に非同期処理モードとして「プロセス」を導入…!
プロセスは、従来のコールバックモードの欠点を補い、非同期処理時点を表すことができる.
コールバックモードの問題
asyncFunction('/step1', a => {
asyncFunction(`/step2/${a}`, b => {
asyncFunction(`/step3/${b}`, c => {
asyncFunction(`/step4/${c}`, d => {
console.log(d)
});
});
});
});
callback hellは毒性が悪く、ミスを招く.また、非同期コールバックモードでは、エラーが扱いにくいのが最大の問題です!プロセスの作成
new演算子とともにPromiseコンストラクション関数を呼び出すとPromiseオブジェクトが生成されます.
Promiseコンストラクション関数は、非同期処理を実行するコールバック関数をパラメータとして渡します.このコールバック関数は、パラメータとして関数を再解析、拒否します.
const promise = new Promise((resolve, reject)=>{
// Promise 함수의 콜백 함수 내부!! 에서 비동기 처리를 수행
if(/*비동기 처리 성공시*/){
resolve('result')
} else {
/*비동기 처리 실패시*/
reject('failure reason')
}
})
Promiseジェネレータ関数がパラメータとして受信したコールバック関数内部で非同期処理を実行する.非同期処理が成功すると、コールバック関数の最初のパラメータに渡される解析関数が呼び出され、非同期処理が失敗すると、2番目のパラメータ拒否関数が呼び出されます.
プロセスステータス
プロセスには、非同期処理の進捗状況を把握するためのステータス情報があります.
非同期処理に失敗した場合、拒否関数を呼び出してプロセスを拒否状態に変更します.
完了または拒否されたステータスを解決済みステータスと呼び、成功または失敗にかかわらず非同期処理が実行されるステータスを表します.いったん安定したら、もう変えられない!
プロセス結果値
プロセスには非同期処理状態と非同期処理結果があります.
たとえば、PromiseStatusとPromiseResultです.
非同期処理が成功した場合、完了ステータスに変更され、結果値は1になります.
非同期処理に失敗した場合は拒否状態に変更され、結果値はErrorオブジェクトになります.
プロセスは、非同期処理ステータスと処理結果を管理するオブジェクトです.
プロセスの後続処理方法
プロセスの非同期処理状態が変化した場合、対応する後続処理が必要です.完了したら、処理結果があって後続処理を行い、拒否されたらエラー処理を行います.
promisはthen、catch、finallyを後続の方法として提供した.
プロセスの非同期処理状態が変化すると、パラメータとして後続の処理方法に渡されるコールバック関数が選択的に呼び出される.このときpromisの結果値はコールバック関数のパラメータに渡されます!!
後続の処理方法はすべてプロセスに戻り、非同期で実行されます.
Promise.prototype.then
2つのコールバック関数をパラメータとして渡します.
Promise.prototype.catch
catchはコールバック関数をパラメータとして渡します.
プロセスが拒否されている場合にのみ呼び出されます.
catchはthen(Undefind,onRejected)と同じ操作なので、常にプロセスを返します.
new Promise((_, reject) => reject(new Error('rejected!')))
.catch(err => console.log(err))
// Error: rejected!
new Promise((_, reject) => reject(new Error('rejected!')))
.then(undefined, err => console.log(err))
// Error: rejected!
catchメソッドが呼び出されると、内部でthen(undefined,onrejected)が呼び出されます.しかし,then法における2番目のコールバック関数は1番目のコールバック関数で発生した誤りを捉えることができず,コードが複雑になり,毒性にもよくない.
すべてのthenメソッドを呼び出した後にcatchメソッドを呼び出すと、非同期処理で発生したエラーとthenメソッド内部で発生したエラーをキャプチャできます.この方法の可読性も良好であるため,エラー処理はcatchを用いることを推奨する.
Promise.prototype.finally
最後に、コールバック関数をパラメータとして渡します.
プロミスの状態にかかわらず、彼は無条件に一度呼び出される.
やはりフロミスに戻ります.
学習者はJavaScript Deepでダイビング
Reference
この問題について([JS Deep Dive]プログラム), 我々は、より多くの情報をここで見つけました https://velog.io/@skh417/JS-Deep-Dive-프로미스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol