プロが教えるわが家の防犯対策術!

初心者です。Javascriptの関数についての質問です。
requestモジュールを使用してAPIをたたき、結果をreturn値として返す関数を作りたいと思っています。(簡潔にするためurl部分は省略しています。)


var forsquare = require("request");

function Search(lat,lon,radius){

var client_id = "****************";
var client_secret = "*****************";
var url = "*****************";
var options = {
url: url,
json: true
};

forsquare.get(options, function (error, response, body){
if (! ("groups" in body.response)) {
console.log(error);
} else {
var result = body.response.groups[0].items;
return result;
};
});
};

var a = Search(lat, lon, radius);
console.log(a);

resultをreturnで返したいと思っているのですが結果が"undefine"となってしまいます。
スコープの問題で、resultの参照範囲がforsquare.get以降にある無名関数の中に限られることが原因であると思っているのですが、get以降の結果を外部から参照する方法が思いつきません。
コード全体を無名関数として囲ってしまう方法?等も試したのですがうまくいきませんでした。どなたかご教示していただけますと助かります。

A 回答 (1件)

不明な情報があるので、よくわかりませんが・・・


ajaxのような処理を行っているのではないかと推測しました。
(「requestモジュール」と書いてあるので、node.jsのたぐいでしょうか?)
(仮にそうでも、node.jsを知らないので同じことなんですが(笑))
  

関数の戻り値は、呼び出し元に返されます。
ご提示の
 var a = Search(lat, lon, radius);
の場合でみると、Search関数はreturn値をもたないので、aの値はundefinedとなります。
それなので、ご質問のような状態になっているのではないでしょうか?
(半分推測ですが…)


また、forsquare.get()の第二引数は、いわゆるcallback関数と仮定すれば・・・
callback関数は、通常、ある処理(例えば送受信)が完了した時点で実行されますので、
 >var a = Search(lat, lon, radius); //①
 >console.log(a);          //②
①でSearch関数から制御が戻った時点では、まだcallback関数が実行されていない可能性が高いと思われます。
それなので、②の処理の際にも同様にまだ結果は受け取っていないはず。


関数の仕組みと、実行のタイミングを再確認してみてください。
(かなりの憶測で書いてますので、外れてたらごめんなさい)


>resultの参照範囲がforsquare.get以降にある無名関数の中に限られることが~~
関数内部で定義された変数は、直接、関数の外部からは参照できませんが、return値は関数の呼び出し元に返されますよ。(そのためのreturn文のはずです)
ご質問の場合、匿名関数の呼び出し元は、関数forsquare.get内にあると推測されます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!