2015-12-28 6 views
0

Я пытаюсь передать дополнительную переменную (devicename) в session.pingHost, так что только после того, как ping вернет ответ, я запустил еще одну функцию (someOtherFunction), которая требует переменную. В настоящее время someOtherFunction получает devicename как неопределенное.Передача переменных в функцию 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, а затем аргументы, с которыми была вызвана новая функция.

Но я не вижу в этом необходимости. Единственная реальная причина, по которой вам понадобится bind, - это если вы хотите получить значение devicename с момента создания функции (потому что она может измениться).


Существует несвязанной проблемы: Вы жертвой The Horror of Implicit Globals, потому что вы не объявить pingresult переменных. Всегда обязательно указывайте свои переменные в соответствующем контексте.

+0

Спасибо за ваш ответ. Проблема в том, что когда я делаю это так и называю someOtherFunction, devicename не определено. то есть. не передается в session.pingHost. – sardaukar81

+1

@ sardaukar81: Значение 'devicename' в' pingHost' будет полностью зависеть от того, как вы вызываете 'pingHost', который вы не показывали. Если вы вызываете 'pingHost' с правильным значением в качестве второго аргумента, это же значение будет использоваться позже для вызова' someOtherFunction'. –

+0

Привет, TJ: Я обновил свой вопрос в соответствии с вашими предложениями. Проблема в том, что session.pingHost является частью библиотеки net-ping, поэтому я не могу добавить в нее дополнительные аргументы. Я не могу понять, как передать devicename для someOtherFunction через session.pingHost. – sardaukar81

Смежные вопросы