Javascript noob here。抱歉,如果有大量重复的问题,因为看起来这似乎是一个基本的js函数的事情,但我老实说无法找到答案。我试图在一个函数中包含一个API GET调用,并且我遇到了一些我不太了解的行为。有问题的代码:
我使用node-rest-client软件包调用mapquest地理编码API。我只对lat / long数据感兴趣。
var Client = require('node-rest-client').Client;
如果我像这样进行GET调用,我可以访问parsed
作为对象,这就是我想要的。
var address = 'New York'
var client = new Client();
var parsed;
client.get("http://www.mapquestapi.com/geocoding/v1/address?" +
'key=' + mapquestKeys.consumer_key +
'&location=' + address,
function(data, response) {
parsed = data.results[0].locations[0].latLng
}
);
// parsed == {lat, long}
但是如果我将它包装在一个函数中:
function geocode(address){
var client = new Client();
var parsed;
client.get("http://www.mapquestapi.com/geocoding/v1/address?" +
'key=' + mapquestKeys.consumer_key +
'&location=' + address,
function(data, response) {
parsed = data.results[0].locations[0].latLng
}
);
return parsed
}
var address = 'New York'
parsed = geocode(address);
// parsed === undefined
parsed
似乎不受内在功能的影响;它没有定义。如何将parsed
作为包含我想要的数据的对象返回,如第一个示例中所示?到底发生了什么事?
答案 0 :(得分:0)
你从未在范围内定义解析(在函数外部):
function geocode(address){
var client = new Client();
var parsed;
client.get("http://www.mapquestapi.com/geocoding/v1/address?" +
'key=' + mapquestKeys.consumer_key +
'&location=' + address,
function(data, response) {
parsed = data.results[0].locations[0].latLng
}
);
return parsed
}
var address = 'New York'
var parsed = geocode(address);
注意var parsed = geocode(address);
答案 1 :(得分:0)
你需要将它包装成一个promise,或者使用callback返回结果。回调就像这样:
function call(arg, callback) {
client.get("http:////" + arg, function (data, response) {
callback(data.results[0].locations[0].latLng)
});
}
call("yolo", function (parsed) { console.log(parsed) })
承诺在这里有详细描述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
答案 2 :(得分:0)
在:
function geocode(address){
var client = new Client();
var parsed;
client.get("http://www.mapquestapi.com/geocoding/v1/address?" +
'key=' + mapquestKeys.consumer_key +
'&location=' + address,
function(data, response) {
parsed = data.results[0].locations[0].latLng
}
);
return parsed
}
var address = 'New York'
parsed = geocode(address);
// parsed === undefined
您从未在函数范围之外定义parsed
。此外,在有机会从GET请求中检索之前,您将在函数内部返回parsed
。如果你想这样做,你需要将return(prased)
放在client.get
的回调函数中。更好的方法是将它包装在Promise中,如下所示:
function geocode(address){
return new Promise((resolve, reject) => {
var client = new Client();
client.get("http://www.mapquestapi.com/geocoding/v1/address?" +
'key=' + mapquestKeys.consumer_key +
'&location=' + address,
function(data, response) {
if(data){
resolve(data.results[0].locations[0].latLng)
}
else{
reject(response)
}
});
})
};
var address = 'New York';
var parsed;
geocode(address).then(function(latlong){
parsed = latlong
}).catch(err => {
console.log(err)});
这里,解析只会在Promise解析后评估为latlong
(GET请求已成功返回)。如果GET请求的数据为NULL并返回错误,它也将拒绝Promise。
如果您想对parsed
执行某些操作,可以在.then()
语句中包含该内容。
学习如何使用Javascript编写代码意味着学习如何异步编写代码 。 Promise可以帮助您将默认异步的内容视为同步。