Javascript 如何从函数中获取API响应数据?
这里没有。抱歉,如果有大量重复的问题,因为这似乎是一个基本的js函数,但我真的找不到答案。我试图将一个API GET调用包装到一个函数中,但遇到了我不理解的行为。有关守则: 我正在使用NodeREST客户端包调用mapquest地理编码API。我只对横向/纵向数据感兴趣Javascript 如何从函数中获取API响应数据?,javascript,scope,http-get,node-rest-client,Javascript,Scope,Http Get,Node Rest Client,这里没有。抱歉,如果有大量重复的问题,因为这似乎是一个基本的js函数,但我真的找不到答案。我试图将一个API GET调用包装到一个函数中,但遇到了我不理解的行为。有关守则: 我正在使用NodeREST客户端包调用mapquest地理编码API。我只对横向/纵向数据感兴趣 var-Client=require('node-rest-Client')。客户端 如果我像这样进行GET调用,我可以作为一个对象访问parsed,这就是我想要的 var address = 'New York' var c
var-Client=require('node-rest-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
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);
parsed
似乎不受内部函数的影响;没有定义。如何将解析后的作为包含第一个示例中所需数据的对象返回?这到底是怎么回事?您从未在作用域(函数外部)中定义解析:
注意var parsed=geocode(地址)代码>您需要将其包装成一个承诺,或者通过回调返回结果。回调将如下所示:
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) })
承诺在这里有很好的描述:在:
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
您从未在函数范围之外定义解析的。另外,在函数有机会从GET请求中检索之前,您正在函数内部返回已解析的。如果您想这样做,您需要将return(prase)
放在client.get的回调函数中。更好的方法是将其包装在承诺中,如下所示:
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)});
在这里,解析将只在承诺得到解决(GET请求返回成功)后计算为latlong
。如果GET请求的数据为NULL并返回错误,它还将拒绝承诺
如果您想对已解析的执行某些操作,可以将其包含在.then()
语句中
学习如何使用Javascript编写代码意味着学习如何异步编写代码。承诺帮助您将默认情况下异步的事情视为同步的事情。您需要将其包装成承诺,或者通过回调返回结果。回调如下:```函数调用(arg,回调){client.get('http:////+arg,函数(数据,响应){callback(data.results[0].locations[0].latLng)})调用(“yolo”,函数(已解析){console.log(已解析)}“承诺在这里描述得很好:为什么有那么多人开始使用Ajax之类的东西,但在尝试使用它之前拒绝阅读有关它的任何内容?”?“A”表示函数外部解析变量的asynchronous.missed var这与承诺无关。。。这只是使用一个回调函数。@jmkmay正如我所说,可以使用应答中描述的回调方法,也可以使用承诺。在GET请求本身解决之前返回已解析的
,这让我非常困惑。非常感谢!