0

基本的に私はこのコードを持っています。リクエストの結果をコールバックで変数に保存し、プログラムの別の部分に戻すことができます。

var request = require('request');

var geocodeLoc = function(location)
{
    var result;
    var baseURL = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + location;
    request(baseURL, function(e, r, b){
        if(!e && r.statusCode == 200){
            result = (JSON.parse(b).results[0].geometry.location);
            console.log(result);
        }
    });
    return result
}
console.log( geocodeLoc('Hoxton') );

console.log(geocodeLoc('Hoxton')) の結果は、console.log(result) が実行される前に返されます。

本当にイライラするのは、 console.log(result) の結果がまさに私が望むものであることです。

これがプログラムの出力です

undefined
{ lat: 51.535638, lng: -0.08934399999999999 }

私が欲しいのは、 geocodeLoc が結果を返すことだけです。私はNodeJSに慣れていないので、助けていただければ幸いです

4

1 に答える 1

4

これは、関数が遅延のある非同期リクエストを作成するために発生します。スレッド全体をブロックしないようにするために、ノードが実行を継続しているため、最初のコンソール ログの後に結果がログに記録されます。Promise を使用できます。promise-simpleまたはqをお勧めします。

結果は次のようになります。

    var request = require('request');
    var Promise = require('promise-simple');
    var geocodeLoc = function(location)
    {
        var result;
        var d = Promise.defer();
        var baseURL = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + location;
    request(baseURL, function(e, r, b){
        if(!e && r.statusCode == 200){
            result = (JSON.parse(b).results[0].geometry.location);
            console.log(result);
            d.resolve(result);
        }else{
            d.reject(e);
        }
    });
    return d;
}
// use it like this:
geocodeLoc('Hoxton').then(function(result){
    console.log('here is your result',result);
});

または、本当に別のモジュールを使用したくない場合は、コールバック関数を使用して同じ結果を得ることができます:

    var request = require('request');
    var geocodeLoc = function(location, callback)
    {
        var result;
        var baseURL = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + location;
    request(baseURL, function(e, r, b){
        if(!e && r.statusCode == 200){
            result = (JSON.parse(b).results[0].geometry.location);
            console.log(result);
            callback(null, result);
        }else{
            callback(e);
        }
    });
}
// use it like this:
geocodeLoc('Hoxton', function(err, result){
    console.log('here is your result',result);
});

コールバック関数では、最初のパラメーターとして常にエラーを返すことをお勧めします。

于 2015-03-20T13:50:03.467 に答える