試しに、下記のようにログを仕込んで実行してみてください。
javascript
1function aa(){
2 console.log('test 1');
3 collections.findOne({}, function (err, docs){
4 console.log('test 2');
5 if(docs == null){
6 return false;
7 }else{
8 return true;
9 }
10 }):
11 console.log('test 3');
12}
13var flag = aa();
test 1
→ test 3
→ test 2
とログが出力するはずです。
これは時間がかかる部分(この場合だとfineOneの内部)を非同期で動作させているためです。
findOneの結果を受け取る方法としては、幾つか方法があるのですが、Promiseを使うのが一般的かと思われます。
Node.jsの場合はbluebirdを使えばOKでしょう。
Promiseを使ったコード例は下記のとおりです。
javascript
1var Promise = require('bluebird');
2
3function aa(){
4 return new Promise(function(resolve, reject) {
5 collections.findOne({}, function (err, docs){
6 if(docs == null){
7 resolve(false);
8 }else{
9 resolve(true);
10 }
11 });
12 });
13}
14aa().then(function(flag) {
15 console.log(flag);
16});
※ 手元で検証できる環境が無いため、未検証なのでエラー等がでたらすみません。。。
Promiseは、簡単に説明すると**「いつ終わるか分からない(非同期の)処理が終わったら通知するよ」という約束を返す**ようなイメージです。
Promiseを返し、終わったらresolve、失敗したらrejectを返します。
Promiseを受け取った側は、thenで終わるのを待ち受けるイメージですね。
駆け足で説明しましたが、参考になりましたら幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/12/02 09:14
2015/12/02 09:18