我正在尝试将另一个变量(devicename)传递给session.pingHost,这样只有在ping返回响应后,才会运行需要变量的另一个函数(someOtherFunction)。目前someOtherFunction接收devicename为undefined。
我将如何做到这一点?有没有更好的方法呢?
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 :(得分: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
,然后是调用新函数的参数。
但我认为这里没有必要。如果您想要在创建函数时获取bind
的值(因为它可能会更改),那么您需要或想要devicename
的唯一真正原因是。
存在无关的问题:由于您未声明pingresult
变量,因此您将成为The Horror of Implicit Globals的牺牲品。始终确保在适当的上下文中声明您的变量。