0

Javascript菜鸟在这里。如果有大量重复的问题,我们深表歉意,因为这似乎是一个基本的 js 函数,但老实说,我找不到这个问题的答案。我正在尝试将 API GET 调用包装在一个函数中,但我遇到了我不理解的行为。有问题的代码:

我正在使用 node-rest-client 包来调用 mapquest 地理编码 API。我只对纬度/经度数据感兴趣。
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像第一个示例中那样作为包含我想要的数据的对象返回?这到底是怎么回事?

4

3 回答 3

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

于 2018-05-18T17:43:10.217 回答
0

你需要把它包装成一个promise,或者用回调返回结果。回调将是这样的:

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

于 2018-05-18T17:46:16.867 回答
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在功能范围之外进行定义。parsed此外,在它有机会从 GET 请求中检索之前,您正在返回函数内部。如果你想这样做,你需要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)});

在这里,parsed 只会latlong在 Promise 被解决(GET 请求返回成功)后评估。如果 GET 请求的数据为 NULL,它也会拒绝 Promise 并返回错误。

如果您想随后做某事,parsed可以将其包含在.then()声明中。

学习如何用 Javascript 编写代码意味着学习如何异步编写代码。Promise 可帮助您将默认异步的事物视为同步的。

于 2018-05-18T18:10:34.143 回答