Как дождаться результата функции перед тем, как продолжить работу со сценарием? - PullRequest
0 голосов
/ 03 ноября 2019

В настоящее время я создаю скрипт Nodejs, который должен взаимодействовать с веб-сервером и устройством локальной сети. Чтобы сделать программу максимально надежной, я хочу выполнить простой тест ping, чтобы проверить, можно ли подключиться к сетевому устройству.

var ping = require('ping');

function pingtest(host) {
    ping.sys.probe(host, function (isAlive) {
        var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead';
        console.log(msg);

        return isAlive;
    });
}

let pingSuccessful = pingtest('192.168.178.100');

console.log(pingSuccessful);
console.log('Should not executed before pingtest has finished.');

Вывод на консоли следующий:

undefined
Should not executed before pingtest has finished.
host 192.168.178.100 is dead

Проблема в том, что выполнение скрипта должно быть приостановлено до тех пор, пока pingtest () не завершит работу и не вернет результат. Моя цель состоит в том, чтобы console.error () сообщение и остановка сценария, если этот тест не прошел. Я уже пробовал это с async await и другими примерами кода на https://github.com/danielzzz/node-ping, но, к сожалению, это не сработало, как ожидалось.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Вы просто не можете вернуться с обратного вызова. Вы можете использовать обещание. Измените код следующим образом:

function pingtest(host) {
  return new Promise((resolve, reject) => {
    ping.sys.probe(host, function (isAlive) {
        var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead';
        console.log(msg);

        resolve(isAlive);
    });
  });
}

pingtest('192.168.178.100').then((pingSuccessful) => {
  console.log(pingSuccessful);
});

Или вы должны сделать все внутри ping.sys.probe обратного вызова.

1 голос
/ 03 ноября 2019

да, это асинхронный поток, вы можете использовать async / await для решения этой проблемы

function pingtest(host) {
    return newPromise((res, rej) => {
        ping.sys.probe(host, function (isAlive) {
            var msg = isAlive ? 'host ' + host + ' is alive' : 'host ' + host + ' is dead';
            console.log(msg);
            res(isAlive)
        });
    }
}

const startPing = async () => {
    let pingSuccessful = await pingtest('192.168.178.100');

    console.log(pingSuccessful);
    console.log('Should not executed before pingtest has finished.');
}

startPing()
...