代码之家  ›  专栏  ›  技术社区  ›  Guy Giesa-Wilson

如何从函数中获取API响应数据?[重复]

  •  0
  • Guy Giesa-Wilson  · 技术社区  · 6 年前

    这里没有。如果有很多重复的问题,我深表歉意,因为这似乎是一个基本的js函数问题,但我真的找不到答案。我试图在函数中封装一个API GET调用,但遇到了我不理解的行为。有关守则:

    我正在使用node rest客户端包调用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
    

    解析 似乎不受内在功能的影响;没有定义。我怎么回去 解析 作为包含第一个示例中所需数据的对象?这到底是怎么回事?

    3 回复  |  直到 6 年前
        1
  •  0
  •   jmkmay    6 年前

    在:

    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请求中检索之前。如果你想这样做,你需要 return(prased) 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)});
    

    在这里,解析的结果将只计算为 latlong 一旦承诺得到解决(GET请求返回成功)。如果GET请求的数据为空并返回错误,它也将拒绝承诺。

    如果你想做点什么 解析 你可以把它包括在 .then() 陈述

    学习如何用Javascript编写代码意味着学习如何编写代码 异步地 .承诺帮助你处理那些默认的事情 异步的 同步的 .

        2
  •  0
  •   Robert Talada    6 年前

    您从未在作用域(函数外部)中定义解析:

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

        3
  •  0
  •   Dmitrijs Balcers    6 年前

    你需要把它包装成一个承诺,或者用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