Nodejs如何在没有settimeout的情况下访问回调结果

Nodejs how to access Callback results outsite without setTimeouts?

本文关键字:情况下 访问 回调 结果 settimeout Nodejs      更新时间:2023-09-26

我是nodejs和javascript的新手。我正在学习异步编程。我正试图找到一个域名的ip地址。我正在使用nodejs内置"DNS"库。

dns.resolve(domainName, function onLookup(err, addresses, family) {
            if (err){
                res.send(err);
            } else {
                 console.log(addresses);
                 var domainAddress = addresses;
            }
        });

这是实际代码。我正试图从回调中获得域名地址。由于它的异步编程,它需要时间来获得domainAddress和我无法访问它一段时间。

如果我使用这样的代码,我可以访问domainAddress

dns.resolve(domainName, function onLookup(err, addresses, family) {
                                if (err){
                                    res.send(err);
                                } else {
                                    domainAddress = addresses;
                                }
                            });
        setTimeout(function() {
          console.log(domainAddress);
        }, 1000);

但是我不认为这是导出回调结果到主程序的正确方法。

你能给出这个问题的其他解决方案吗?

注意:我想做额外的任务一旦我得到IP。我想根据ip地址找到地理位置。为此,我需要将此IP传递给一个称为Geoip-lite的单独模块。但是由于我无法在外部获取地址,这变得非常困难

function myResolve(domainName, callback){
    dns.resolve(domainName, function onLookup(err, addresses, family) {
            if (err){
                return callback(err);
            } else {
                return callback(null, addresses);
            }
        });
}

myResolve(domainName, function(err, addresses){
    if(err){
        return res.send(err);
    } else {
        return res.send(addresses);
    }
});

尝试node.js async模块。你可以使用async series。

 var domainAddress;
function findDNS(callback){
   dns.resolve(domainName, function onLookup(err, addresses, family) {
        if (err){
            res.send(err);
        } else {
             console.log(addresses);
              domainAddress = addresses;
              callback(null,"Address found")    
        }
    });
}
function doWhatever(callback){
   console.log("DNS:"+domainAddress);
   callback(null,"OK");
}
async.series([findDNS,doWhatever],function (err, results){
    console.log(results);
});