2017-08-30 146 views
0

我有從JSON文件中讀取的服務器JSON對象的列表。NodeJS Closure - 循環遍歷對象數組並使用每個對象的數據Ping服務器

我正在循環瀏覽每個服務器對象,從對象中獲取一個值並將其與一個字符串連接以創建一個URL。然後,我使用URL發出獲取請求以檢查服務器是否啓動。獲取請求的結果應該設置每個服務器對象的狀態。

問題是,在每個循環中,服務器對象中的值顯示爲未定義。我似乎無法弄清楚我的關閉問題在哪裏。

var servers = require('./data/servers.json'); 
var ping = require('http'); 

var newServers = statusChecker(servers); 

function statusChecker(servers) { 
var i; 
for(i=0;i<servers.length;i++) { 
    servers[i]['status'] = function(j) { 
     return function() { 
       var proto = 'http://' 
       var server = servers[i].servername; 
       var healthEndPoint = '/health-end-point'; 
       var url = proto+server+healthEndPoint; 
        //This logs the url with the server part undefined 
        console.log(url); 
        ping.get(url, function(res){ 
         console.log(res); 
         return true; 
        }).on('error', function(e){ 
         return false; 
        });    
     }() 
    }(i); 
} 
return servers; 
} 

回答

2

狀態爲undefined因爲你試圖插入異步代碼ping.get同步循環中。

你想看看有關Promise.all()Promisesasync/await


這是這是要去的函數的例子,使平

function asynchronousPing(oneServer) { 
    return new Promise((resolve, reject) => { 
     const proto = 'http://' 
     const server = oneServer.servername; 
     const healthEndPoint = '/health-end-point'; 
     const url = proto + server + healthEndPoint; 

     ping.get(url, function (res) { 
     resolve(true); 
     }).on('error', function (e) { 
     resolve(false); 
     }); 
    }); 
    } 

這裏是你怎麼稱呼它

Promise.all(servers.map(x => asynchronousPing(x))) 
    .then((allStatus) => { 
     console.log(allStatus); 
    }) 
    .catch((err) => { 
     console.log(err); 
    }); 
+0

謝謝你的幫助。我運行此代碼時得到的錯誤是UnhandledPromiseRejectionWarning:未處理的承諾拒絕(拒絕標識:3):錯誤:無法確定域名當我在服務器名中硬編碼時,它確實返回了承諾列表 - 你知道嗎解決這個問題? – emerfan

+0

是的,你需要添加'.catch()'到'promise.all'我要編輯我的答案 –