Promiseとは
非同期処理のコードを扱いやすくするもの。
Promiseを用いると、非同期処理のコールバックの扱いがより簡単になる。
Promiseを使った実装・使わない実装
・Promiseを使わずに実装
//doWorkCallback関数の定義constdoWorkCallback=(callback)=>{//非同期処理。2秒後に[1,2,3]を返すsetTimeOut(()=>{callback(undefined,[1,2,3])},2000)}//doWork関数の実行//第一引数:エラー時の返り値、第二引数:処理成功時の返り値doWorkCallback((error,result)=>{if(error){returnconsole.log(error)}console.log(result)})
↓
2秒後に[1,2,3]が返る
または、2秒後にerrorが返る
・Promiseを使って実装
//doWorkPromise関数の定義constdoWorkPromise=newPromise((resolve,reject)=>{//非同期処理。2秒後に[1,2,3]を返すsetTimeOut(()=>{//処理成功時の処理をresolve関数として実装resolve([1,2,3])//エラー時の処理をreject関数として実装reject('Things went wrong')}},2000)//doWorkPromise関数の実行//成功時の処理を、「.then()」をつなげることによって記述doWorkPromise.then((result)=>{console.log('success',result)//エラー時の処理を、「.catch()」をつなげることによって記述}).catch((error)=>{console.log('Error',error)})
↓
2秒後に「success, [1,2,3]」が返る
または、2秒後に「Error Things went wrong」が返る
Promiseを使用するメリット
Promiseを使って実装すると・・・
①成功時の処理はresolve関数、エラー時の処理はreject関数と、2つの別々の関数て処理している為、何が起こっているかわかりやすい。
Promiseを使わないと: 関数1つで成功時とエラー時の処理を行うことになる、
コールバックの全ての呼び出しを調べてから、引数errorと引数result、どちらが提供されたか判断することになる。
②処理結果によって呼び出される関数はresolve関数かreject関数かのどちらか一つ。
呼び出されるとPromiseは終了する為、後から実行結果の値や状態が上書きされることがない。
Promiseを使わないと: コールバックが2回呼び出され、結果が変わるリスクがある。
Promise処理中におこっている事
Promiseが作成される
↓
Pending:非同期処理実行中。Promiseの結果は保留
↓
①fulfilled:処理成功
②rejected:処理失敗
Promiseをチェインさせる
複数の非同期メソッドをつなげて処理を行う時、Promiseをチェインさせて書くことができる。
・Promiseチェインを使わず実装
//add関数の定義。Promiseを使った非同期処理とし、2秒後にa+bの結果を返すconstadd=(a,b)=>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve(a+b)},2000)})}add(1,2).then((sum)=>{ console.log(sum)add(sum,5).then((sum2)=>{ //add関数で、「add(1,2)の結果」と「5」を処理するconsole.log(sum2)}).catch((e)=>{console.log(e)})}).catch((e)=>{ //add(1,2)のエラー処理console.log(e)})
↓
2秒後に「3」、さらに2秒後に「8」が返る
・Promiseチェインを使って実装
//add関数の定義。Promiseを返し、2秒後にa+bの結果を返すconstadd=(a,b)=>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve(a+b)},2000)})}add(1,1).then((sum)=>{console.log(sum)returnadd(sum,4) //add関数で、「add(1,1)の結果」と「4」を処理する。2つ目の非同期処理を returnで返すようにしている}).then((sum2)=>{ //2つ目の非同期処理を「.then()」で返すconsole.log(sum2)}).catch((e)=>{ console.log(e)})
↓
2秒後に「2」、さらに2秒後に「6」が返る
・Promiseチェインを使うメリット
①ネストを深くせずに、複数の非同期処理を繋げて行える
②エラー時の処理コードを重複して書かなくてすむ
参考文献
「The complete Node.js Developer Course」
https://www.udemy.com/share/101WGiAEIedVpTTX4D/