使用 nodejs 请求模块对返回 undefined 进行地理编码的函数
Function to geocode returning undefined with nodejs request module
基本上我有这个代码。我想将回调中的请求结果保存到一个变量中,然后我可以 return 到我程序的另一部分。
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')) 的结果是 return 在执行 console.log(result) 之前。
真正令人沮丧的是 console.log(result) 的结果正是我想要的。
这是程序的输出
undefined
{ lat: 51.535638, lng: -0.08934399999999999 }
我只想要 geocodeLoc 到 return 结果。我对 NodeJS 有点陌生,非常感谢任何帮助
发生这种情况是因为你的函数发出了一个有延迟的异步请求,为了不阻塞整个线程,节点继续执行,这就是为什么你的结果在第一个控制台 log.You 之后记录可以使用承诺。我推荐promise-simple or 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);
});
对于回调函数,建议您始终return将错误作为第一个参数。
基本上我有这个代码。我想将回调中的请求结果保存到一个变量中,然后我可以 return 到我程序的另一部分。
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')) 的结果是 return 在执行 console.log(result) 之前。
真正令人沮丧的是 console.log(result) 的结果正是我想要的。
这是程序的输出
undefined
{ lat: 51.535638, lng: -0.08934399999999999 }
我只想要 geocodeLoc 到 return 结果。我对 NodeJS 有点陌生,非常感谢任何帮助
发生这种情况是因为你的函数发出了一个有延迟的异步请求,为了不阻塞整个线程,节点继续执行,这就是为什么你的结果在第一个控制台 log.You 之后记录可以使用承诺。我推荐promise-simple or 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);
});
对于回调函数,建议您始终return将错误作为第一个参数。