javascript - 在有机会设置重要数据之前就忽略了函数调用

标签 javascript node.js callback request

所以我在node.js中有这个函数,它通过从https://icanhazip.com/(方便的网站,检查一下)获取外部IP,但是当请求是调用它不允许在调用 return 之前完成。这是代码:

var request = require('request');
var get_ext_ip = function(){
    var _ip; //Initialize a return variable

    //Launch an HTTPS request to a simple service that shows IP of client
    //The callback function isn't allowed to finish.
    request('https://icanhazip.com', function(error, response, body){
        _ip = body; //when finished store the response in the variable that is going to be returned.
    });

    //Return
    return _ip;
}

var ip = get_ext_ip();
console.log(ip); //undefined

所以我想,这里的问题是:如何让这个脚本在返回值之前等待回调函数完成?

最佳答案

这是因为 Node 中 I/O 请求的异步特性:函数 get_ext_ip 在请求完成之前返回。

处理此问题的方法之一是传递一个回调函数,该函数将在请求完成时被调用:

var request = require('request');
var get_ext_ip = function(callback) {
  request('https://icanhazip.com', function(error, response, body) {
    callback(error, body);
  });
}

get_ext_ip(function(err, ip) {
  if (err)
    console.log('an error occurred:', error);
  else
    console.log(ip);
});

关于javascript - 在有机会设置重要数据之前就忽略了函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16021448/

相关文章:

javascript - 使用 jQuery 在垂直多级弹出菜单中出现问题

javascript - 如何在同一个文件中调用Javascript方法?

node.js - 在 WordPress docker 镜像上安装 NodeJS - Node : not found

node.js - ( Node :11684) [DEP0062] DeprecationWarning: `node --inspect --debug-brk` is deprecated. 请改用 `node --inspect-brk`

javascript - 在非阻塞回调函数中递归调用父函数

javascript - Highcharts 如果标题包含数字,则显示无效数据

javascript - 如何在特定的资源管理器中使用 javascript 添加带有链接的图像?

javascript - 无法完成与服务器的协商 - Angular + SignalR

JavaScript:突破回调函数

python - 将额外的 void* 与 C 回调一起传递是标准做法吗