【问题标题】:Function to geocode returning undefined with nodejs request module使用nodejs请求模块返回未定义的地理编码功能
【发布时间】:2015-03-20 13:03:07
【问题描述】:

基本上我有这个代码。我想将回调中的请求结果保存到一个变量中,然后我可以返回到程序的另一部分。

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有点不熟悉,非常感谢任何帮助

【问题讨论】:

    标签: javascript node.js httprequest node-request


    【解决方案1】:

    发生这种情况是因为您的函数发出了一个延迟的异步请求,为了不阻塞整个线程,节点正在继续执行,这就是您的结果在第一个控制台日志之后记录的原因。您可以使用承诺。我推荐promise-simpleq

    结果将如下所示:

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

    对于回调函数,建议您始终将错误作为第一个参数返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2017-07-14
      • 2021-01-28
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      相关资源
      最近更新 更多