質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

1914閲覧

javascriptの関数の戻り値

momijiMac

総合スコア39

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2016/12/22 08:39

  • 質問

javascriptの関数の戻り値が思った通りになりません。
"this is error"が帰ってきたあと、
for文が実行されて
console.log(docs[i]);
が評価されてしまいます。
docsだけ帰るようにしたいのですが何が問題でしょうか?


  • 環境

mac osx sierra
node.js
mongoose
socket.io


  • コード
function returnData () { Data.find({}, function(err, docs) { for (var i=0, size=docs.length; i<size; ++i) { console.log(docs[i]); } return docs; }); console.log('this is error'); return "error!"; };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

簡略化して書くと下記のようなコードの流れになっていますね。
Data.find console.log return文 は、条件にかかわらずすべて実行される形になっています。
Data.findの結果次第で、後の処理を実行するかしないかを決めるためには、何らかの工夫が必要です。
少なくとも、Data.findの処理を待ってから後の処理を 行う/ 行わない 形に改める必要があります。

javascript

1function returnData() { 2 Data.find(...); 3 console.log('this is error'); 4 return "error!"; 5};

投稿2016/12/23 13:38

yamato_hikawa

総合スコア2092

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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 });

ご参考までに

投稿2016/12/22 10:46

Everatch

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Data.find()のコールバック関数でreturn docs;をやってますが、これはreturnData()のreturnではなくコールバック関数のreturnになるからです。
書くとするのであれば

js

1function returnData (callback) { 2 Data.find({}, function(err, docs) { 3 if(err) { 4 console.log('this is error'); 5 callback("error!"); 6 } else { 7 for (var i=0, size=docs.length; i<size; ++i) { 8 console.log(docs[i]); 9 } 10 callback(docs); 11 } 12 }); 13}

といった感じで書区べきだと思います。(もしくはPromiseを使うか)

投稿2016/12/22 09:03

turbgraphics200

総合スコア4267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問