2015-08-26 25 views
0

我是nodejs和javascript的新手。我正在學習異步編程。我試圖找到一個域名的IP地址。我正在使用nodejs inbuild「DNS」庫。Nodejs如何在沒有setTimeouts的情況下訪問回調結果?

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

這是實際的代碼。我正嘗試將domainAddress從回調中取出。由於它的異步編程,需要一段時間才能獲得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的單獨模塊。但由於我無法得到外面的地址越來越困難

+1

不能全部依賴於'domainAddress'的操作應該放在回調 –

+0

內不要使用setTimeout的,你不知道有多少時間是必要的...... – Thierry

+0

包裹你的DNS。使用回調作爲參數解決函數中的調用。使用domainAdress – cviejo

回答

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

請試試這段代碼。

+1

你能解釋一下你做了什麼嗎?如果有解釋,情況會更清楚。 – rottenoats

+1

不要急於給出答案。 'setTimeout'可以在這裏刪除。 – Sylvain

+0

此代碼無法使用。此功能後我不想發送迴應。我想在獲得IP地址後再做更多的事情。所以我想將地址導出到主函數。 – Bala

2

嘗試node.js異步模塊。 你可以爲此使用異步系列。

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

}); 
+0

異步系列的作品,我想我可以把我所有的事件鏈接到數組。 – Bala

+0

你可以在這個數組中添加更多的事件 – Subham

相關問題