将变量传递给node.js函数

时间:2015-12-28 11:13:15

标签: javascript node.js

我正在尝试将另一个变量(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);

    });
}

1 个答案:

答案 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的牺牲品。始终确保在适当的上下文中声明您的变量。