Rso's Jotter

日々の開発の知見のメモやその他雑記

node.js(javascript)の非同期実行

javascriptJavaの感覚で触ってたら上手く行かなかったのでそのメモ。


とあるDBにuuidと名前(nickname)のペアが保存されていて、
uuidを元にその名前を取得したい関数を作ろうとした。


Javaのノリで書いたのが以下のコード

var getUserName = function(uuid){
        var nickname = 'null';
        Schema.User.findOne({"uuid" : uuid} , function(err, doc){
                if(err){
                        logger.warn('error is occuerd);
                }
                if(doc){
                        nickname =  doc.nickname;
                        logger.debug('nickname' + nickname);
                }else{
                        logger.warn('getUserName is FAILED uuid:' + uuid);
                }
        });
        return nickname;
}


ところがこのコードではfindOneでの結果がnicknameに返される前にreturnが
先に実行されてしまうので名前を取ってくることが出来ない。


これはとりあえず以下のように書き換えると意図したようには動作した。

var getUserName2 = function(_uuid, callback){
        var nickname = 'null';
        console.log("uuid:" + _uuid);
        Schema.User.findOne({"uuid" : _uuid} , function(err, doc){
                if(err){
                        logger.warn('error is occured:' + _uuid);
                }
                if(doc){
                        callback(doc.nickname);
                }else{
                        logger.warn('getUserName is FAILED uuid:' + _uuid);
                }
        });
}

このようにしてコールバック関数を渡して使う。

getUserName2(uuid, function(name){
                 logger.debug('nickname:' + name);
});


javascriptはこうして関数をポコポコ宣言して渡せるのはいいんだけど、実行の順序が予想と違うことがよくあるので気をつけないといけない。
とりあえず今回はこれで動いたけどもっとスマートに書ける方法がありそう。。