【javascript】promiseの使い方メモ〜条件分岐とか
はじめに
node.jsでのサーバーサイドの処理です。
今回やりたかったことはPHPだと以下のような処理
※あまり意味のないコードをズラズラ書いてわかりずらいが、やりたことはDBから取得した値を見て処理を分岐するような処理を繰り返し行うようなイメージ
PHPの場合
try { $id = 1; $user = getUser($id); if (empty($user)) throw new Exception; if ($user["school_id"]) { $school = getSchool($user["school_id"]); if (empty($school)) throw new Exception; $area = getArea($school["area_id"]); if (empty($area)) throw new Exception; } else if ($user["company_id"]) { $company = getCompany($user["company_id"]); if (empty($company)) throw new Exception; $area = getArea($company["area_id"]); if (empty($area)) throw new Exception; } // success var_dump($area); } catch(Exception $e) { // errror } // 以下はDBから値を取得して返す関数 function getUser function getSchool function getCompany function getArea
promiseを使ってjavascriptで実装してみる
PHPで実装するのと決定的に違うのはDBなどから値を取得すると結果が非同期で返ってくるとういこと。
jqueryとかでapi叩いて結果をコールバックで取得とかで今まで何も困ることはありませんでした。
が、サーバーサイドをjsで作り始めたら非同期の処理を何度も連続で呼ぶ形になってしまいコレを全てコールバックの入れ子で実装するとさすがにしんどいかも。。。
ということでPromiseの使い方を調べました。
var id = 1; getUser(id) .then(function(user) { if (user.school_id) return getSchool(user.school_id); else if (user.company_id) return getCompany(user.company_id); else throw new Error; }) .then(function(result) { return getArea(result.area_id); }) .then(function(area) { // success console.log(area); }) .catch(function(e) { // error }); // 以下はDBから値を取得して返す関数 // 今回はpromiseの話なのでダミー。とりあえず非同期で値を返す形としておく function getUser(id) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve({ id: 1, school_id:1, // or company_id:1, }); }); }); } function getSchool function getCompany function getArea
promiseとかよくわからなかったけど、実際使ってみると便利かも。
自分的なポイントとしてはthenの戻り値にnew Promiseを返すところ
ここを見落としてて上手くいきませんでした
すごいシンプルになった。
むしろPHPで書いたコードより見やすいかも。。。
以上です