[JS Deep Dive]プログラム


プロミスとは何ですか。


プロミス客体です
プロセスは、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番目のパラメータ拒否関数が呼び出されます.

プロセスステータス


プロセスには、非同期処理の進捗状況を把握するためのステータス情報があります.
  • pending:非同期処理未実行
  • 完了:非同期処理実行済み(成功)
  • 拒否:非同期処理の実行(失敗)
  • 非同期処理が成功した場合、解析関数を呼び出してプロセスを完了に変更します.
    非同期処理に失敗した場合、拒否関数を呼び出してプロセスを拒否状態に変更します.
    完了または拒否されたステータスを解決済みステータスと呼び、成功または失敗にかかわらず非同期処理が実行されるステータスを表します.いったん安定したら、もう変えられない!

    プロセス結果値


    プロセスには非同期処理状態と非同期処理結果があります.
    たとえば、PromiseStatusとPromiseResultです.

    非同期処理が成功した場合、完了ステータスに変更され、結果値は1になります.

    非同期処理に失敗した場合は拒否状態に変更され、結果値はErrorオブジェクトになります.
    プロセスは、非同期処理ステータスと処理結果を管理するオブジェクトです.

    プロセスの後続処理方法


    プロセスの非同期処理状態が変化した場合、対応する後続処理が必要です.完了したら、処理結果があって後続処理を行い、拒否されたらエラー処理を行います.
    promisはthen、catch、finallyを後続の方法として提供した.
    プロセスの非同期処理状態が変化すると、パラメータとして後続の処理方法に渡されるコールバック関数が選択的に呼び出される.このときpromisの結果値はコールバック関数のパラメータに渡されます!!
    後続の処理方法はすべてプロセスに戻り、非同期で実行されます.

    Promise.prototype.then


    2つのコールバック関数をパラメータとして渡します.
  • 最初のコールバック関数がプロセス完了時に呼び出され、プロセスの結果値がパラメータとして渡される
  • 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でダイビング