読者です 読者をやめる 読者になる 読者になる

【javascript】promiseの使い方メモ〜条件分岐とか

javascript node.js

はじめに

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で書いたコードより見やすいかも。。。
以上です