javascript
1function returnData () {
2 Data.find({}, function () {
3 return "error!";
4 })
5}
上記のreturnではreturnDataの返り値になりません、
Data.findの引数にあるfunctionの返り値として、下記と同じ動きになります。
javascript
1function returnData () {
2 Data.find({}, "error!");
3}
これを見ればわかりますように、returnData自体は何も返していません。
このようにある関数Aが別の関数Bの実行結果を待って実行(非同期処理)させるためには、
Javascriptではreturnで解決できない場合があります。
解決方法
1、コールバック関数
関数Aを関数Bの引数に渡し、コールバック関数として、関数Bの実行終了時に実行する
javascript
1function printData ( data ) {
2 //成功時
3 console.log(data);
4}
5
6function isError () {
7 //失敗時
8 console.log("error!");
9}
10
11function returnData (success, failed) {
12 Data.find({}, function (err, docs) {
13 for (var i=0, size=docs.length; i<size; ++i) {
14 success(docs[i]);
15 return;
16 }
17 success(docs);
18 return;
19 })
20 failed();
21}
22
23returnData(printData, isError);
2、Promiseを使う
javascript
1function returnData () {
2 return new Promise(function (resolve, reject) {
3 Data.find({}, function (err, docs) {
4 for (var i=0, size=docs.length; i<size; ++i) {
5 resolve(docs[i]);
6 return;
7 }
8 resolve(docs);
9 return;
10 })
11 reject();
12 })
13}
14
15returnData()
16 .then(function (arg) {
17 //成功時
18 console.log(arg);
19 })
20 .catch(function () {
21 //失敗時
22 console.log("error!");
23 });
ご参考までに
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。