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

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

ただいまの
回答率

90.47%

  • JavaScript

    20945questions

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

  • Node.js

    2421questions

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

  • MacOS(OSX)

    2393questions

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

  • MongoDB

    280questions

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

  • 関数

    265questions

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

javascriptの関数の戻り値

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 873

momijiMac

score 30

  • 質問

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!";
};
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

function returnData () {
    Data.find({}, function () {
        return "error!";
    })
}

上記のreturnではreturnDataの返り値になりません、
Data.findの引数にあるfunctionの返り値として、下記と同じ動きになります。

function returnData () {
    Data.find({}, "error!");
}

これを見ればわかりますように、returnData自体は何も返していません。

このようにある関数Aが別の関数Bの実行結果を待って実行(非同期処理)させるためには、
Javascriptではreturnで解決できない場合があります。

解決方法

1、コールバック関数

関数Aを関数Bの引数に渡し、コールバック関数として、関数Bの実行終了時に実行する

function printData ( data ) {
    //成功時
    console.log(data);
}

function isError () {
    //失敗時
    console.log("error!");
}

function returnData (success, failed) {
    Data.find({}, function (err, docs) {
        for (var i=0, size=docs.length; i<size; ++i) {
            success(docs[i]);
            return;
        }
        success(docs);
        return;
    })
    failed();
}

returnData(printData, isError);

2、Promiseを使う

function returnData () {
    return new Promise(function (resolve, reject) {
        Data.find({}, function (err, docs) {
            for (var i=0, size=docs.length; i<size; ++i) {
                resolve(docs[i]);
                return;
            }
            resolve(docs);
            return;
        })
        reject();
    })
}

returnData()
    .then(function (arg) {
        //成功時
        console.log(arg);
    })
    .catch(function () {
        //失敗時
        console.log("error!");
    });

ご参考までに

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

function returnData() {
  Data.find(...);
  console.log('this is error');
  return "error!";
};

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    20945questions

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

  • Node.js

    2421questions

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

  • MacOS(OSX)

    2393questions

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

  • MongoDB

    280questions

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

  • 関数

    265questions

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