2015-12-28 116 views
0

我想傳遞一個額外的變量(devicename)到session.pingHost,以便只有一次ping返回響應我運行另一個函數(someOtherFunction)需要變量。目前someOtherFunction接收devicename爲undefined。將變量傳遞到node.js函數

我該如何做到這一點?有沒有更好的方法來做到這一點?

var ping = require("net-ping"); 
var pingresult = ''; 

pingDevice('xxx.xxx.xxx.xxx', 'My Device'); 

function pingDevice(ipaddress, devicename){ 

    var options = { 
     retries: 1, 
     timeout: 2000 
    }; 

    var session = ping.createSession (options); 

    session.pingHost (ipaddress, function (error, target) { 

     if (error) { 
      console.log (target + ": ping FAIL"); 
      pingresult = '0'; 
     } else { 
      console.log (target + ": ping OK"); 
      pingresult = '1'; 
     } 

     someOtherFunction(pingresult,devicename); 

    }); 
} 

回答

0

你這樣做,用事實回調是一個閉包在調用的上下文來pingDevice(其中包含devicename參數)的方式,完全是標準的,正常的做法。你可以做你正在做的事情,並給出顯示的代碼,這是我會做的。

另一個辦法做到這一點是使用Function#bind

session.pingHost (ipaddress, function (devicename, error, target) { 
// ------------------------------------^^^^^^^^^^ 

    if (error) { 
     console.log (target + ": ping FAIL"); 
     pingresult = '0'; 
    } else { 
     console.log (target + ": ping OK"); 
     pingresult = '1'; 
    } 

    someOtherFunction(pingresult,devicename); 

}.bind(null, devicename)); 
//^^^^^^^^^^^^^^^^^^^^^^ 

Function#bind創建一個新的函數,調用它時,會調用原始與特定this值(我們不使用,在這裏,因此null)以及您給bind的任何參數,隨後是調用新函數的參數。

但我在這裏沒有看到任何需要。如果您希望在創建函數(因爲它可能會更改)時獲取devicename的值,那麼您需要或需要bind的唯一真正原因是。


有一個無關問題:你墮入The Horror of Implicit Globals,因爲你不聲明你的pingresult變量。一定要確保在適當的上下文中聲明變量。

+0

感謝您的回覆。問題是,當我這樣做,並打電話給其他功能,那麼devicename是未定義的。即。沒有傳入session.pingHost。 – sardaukar81

+1

@ sardaukar81:'pingHost'中的'devicename'的值將完全取決於你如何調用'pingHost',你沒有顯示。假設你用正確的值作爲第二個參數調用'pingHost',稍後將使用相同的值來調用'someOtherFunction'。 –

+0

嗨TJ:我已根據您的建議更新了我的問題。問題是session.pingHost是net-ping庫的一部分,所以我不能在其中添加額外的參數。我無法弄清楚如何通過session.pingHost將devicename傳遞給其他函數。 – sardaukar81