Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从函数中获取API响应数据?_Javascript_Scope_Http Get_Node Rest Client - Fatal编程技术网

Javascript 如何从函数中获取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

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

我正在使用NodeREST客户端包调用mapquest地理编码API。我只对横向/纵向数据感兴趣
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请求本身解决之前返回
已解析的
,这让我非常困惑。非常感谢!