This question already has answers here:
How do I return the response from an asynchronous call?
                            
                                (39个答案)
                            
                    
                2年前关闭。
        

    

我有一个变量范围的问题。我需要能够在“请求”之外访问“ userLocation”。可以在https://github.com/request/request处找到请求包。这是我的以下代码:

var request = require('request');
var userLocation = "";
request('http://ipinfo.io', function(error, res, body) {
    var ipDetails   = JSON.parse(body);
    userLocation    = ipDetails.loc;
});
console.log(userLocation);


当我尝试输出“ userLocation”变量时,它会打印一个空字符串,而不是请求包中的详细信息。

最佳答案

这不是范围问题。 NodeJS的性质是异步的,这意味着console.log(userLocation)在执行之前不会等待您的request完成。这就是为什么Promise和回调函数存在的原因。

如果要打印userLocation,则将其移动到回调函数中,如下所示:

var request = require('request');
var userLocation = "";
request('http://ipinfo.io', function(error, res, body) {
    var ipDetails = JSON.parse(body);
    var userLocation = ipDetails.loc;
    console.log(userLocation);
});


如果您想了解更多信息,请查看此awesome tutorial

09-06 14:52