如何从函数中获取API响应数据?

时间:2018-05-18 17:37:15

标签: javascript scope http-get node-rest-client

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作为包含我想要的数据的对象返回,如第一个示例中所示?到底发生了什么事?

3 个答案:

答案 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可以帮助您将默认异步的内容视为同步