2

Node.jsを学ぼうとしています

関数で独自のコールバックを作成するのに問題があります。とても簡単なことのように思えますが、私はそれを行う方法をよく理解していません。

この関数には住所 (例: "1234 will ln, co") が渡され、Google の geolocate json API を使用して完全な住所、緯度、経度を配列で返します。

これが私のコードです:

//require secure http module
var https = require("https");

//My google API key
var googleApiKey = "my_private_api_key";

//error function
function printError(error) {
    console.error(error.message);
}

function locate(address) {
//accept an address as an argument to geolocate

    //replace spaces in the address string with + charectors to make string browser compatiable
    address = address.split(' ').join('+');

    //var geolocate is the url to get our json object from google's geolocate api
    var geolocate = "https://maps.googleapis.com/maps/api/geocode/json?key=";
    geolocate += googleApiKey + "&address=" + address;

    var reqeust = https.get(geolocate, function (response){

        //create empty variable to store response stream
        var responsestream = "";

        response.on('data', function (chunk){
            responsestream += chunk;
        }); //end response on data

        response.on('end', function (){
            if (response.statusCode === 200){
                try {
                    var location = JSON.parse(responsestream);
                    var fullLocation = {
                        "address" : location.results[0].formatted_address,
                        "cord" : location.results[0].geometry.location.lat + "," + location.results[0].geometry.location.lng
                    };
                    return fullLocation;
                } catch(error) {
                    printError(error);
                }
            } else {
                printError({ message: "There was an error with Google's Geolocate. Please contact system administrator"});
            }
        }); //end response on end

    }); //end https get request

} //end locate function

したがって、関数を実行しようとすると

var testing = locate("7678 old spec rd");
console.dir(testing);

コンソールは、locate からの戻りを待っていないため、未定義のログを記録します (または、少なくともこれが問題であると推測しています)。

コールバックを作成して、locate 関数が配列を返したときに、返された配列で console.dir を実行するにはどうすればよいですか。

ありがとう!私の質問が理にかなっていることを願っています。私は独学なので、私の技術用語はひどいものです。

4

1 に答える 1

3

メソッドにコールバック関数を渡す必要があるため、コールバックは次のようになります。

function logResult(fullLocation){
    console.log(fullLocation)
}

locateこれを入力とともにメソッドに渡します。

// note: no parentheses, you're passing a reference to the method itself, 
// not executing the method
locate("1234 will ln, co",logResult) 

これをインラインで行うこともできます -responseすでに扱っているオブジェクトと同じように:

locate("1234 will ln, co",function(fullLocation){
    // do something useful here
}) 

メソッド内のビットについては、結果を試す代わりにreturn、結果でコールバックを呼び出すだけです。

function locate(address, callback) {
    ......

    response.on('end', function (){
        if (response.statusCode === 200){
            try {
                var location = JSON.parse(responsestream);
                var fullLocation = {
                    "address" : location.results[0].formatted_address,
                    "cord" : location.results[0].geometry.location.lat + "," + location.results[0].geometry.location.lng
                };
                callback(fullLocation); // <-- here!!!
            } catch(error) {
                printError(error);
            }
        } else {
            printError({ message: "There was an error with Google's Geolocate. Please contact system administrator"});
        }
    }); //end response on end

    .....
}
于 2014-12-17T10:39:24.610 に答える