2017-10-19 51 views
0

我是新來的節點,有一些頭疼的異步編程。 我的網絡上有一個簡單的腳本ping設備。 現在我想要構建以下內容:如果其中一個設備位於網絡上,那麼如何處理回調,以便在所有ping都被終止後才做出決定?node.js - 聯合回調結果

var exec = require('child_process').exec; 

function doThePing(ipaddy){ 
    exec("ping " + ipaddy, puts); 
} 

function puts(error, stdout, stderr) { 
    console.log(stdout); 

    if (error !== null){ 
     console.log("error!!!!"); 
    } 
    else{ 
     console.log("found device!") 
    } 
} 

function timeoutFunc() { 
    doThePing("192.168...."); 
    doThePing("192.168...."); 
    //if all pings are successful then do.. 
    setTimeout(timeoutFunc, 15000); 
} 

timeoutFunc(); 
+0

提到這可能是他lp你https://stackoverflow.com/questions/28849900/how-to-wait-for-function-to-finish-before-continuning-in-node-js – Rijo

+0

[Promise](https://developer.mozilla。 org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise)可以幫助您,爲每個ping回調創建一個承諾,然後等待所有競爭 – aspark

+0

[Promise](https://developer.mozilla.org/zh -CN/docs/Web/JavaScript/Reference/Global_Objects/Promise)可以幫助您,爲每個ping回調創建一個承諾,然後等待所有競爭 – aspark

回答

1

你可以 「Promisify」 的exec調用,從文檔採取

const util = require('util'); 
const exec = util.promisify(require('child_process').exec); 

更新您的ping功能來回報承諾

function doThePing(ipaddy){ 
    return exec("ping " + ipaddy); 
} 

然後包裹在一個所有結果的承諾Promise.all

Promise.all([doThePing("192.168...."),doThePing("192.168....")).then(function(values) { 
    // all calls succeeded 
    // values should be an array of results 
}).catch(function(err) { 
    //Do something with error 
}); 
+0

有意思......那麼這個pinge會按順序還是並行執行呢? – 6230R

+0

我無法執行此操作:(node:9600)UnhandledPromiseRejectionWarning:未處理的承諾拒絕(拒絕標識爲1):錯誤:命令失敗:ping 192.168.178.22 (node:9600)[DEP0018]棄用警告:未處理的承諾拒絕。將來,未處理的承諾拒絕將以非零退出代碼終止Node.js進程。另外,對我來說,它看起來像返回執行沒有返回任何東西? – 6230R

+0

橡木,我修正了這個錯誤,但它仍然沒有做我想做的事。 basiclly我想平行ping x設備,知道誰在線並繼續後續。上面的代碼等待調用完成,但仍然無法評估exec輸出... – 6230R