асинхронная запись узла js из переменной, которая случайно обновляется, как сети Wi-Fi - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь отобразить сети Wi-Fi вокруг меня на веб-странице.Но из-за асинхронного характера узла js.Я получаю значение undefined, так как оно возвращает значение до завершения сканирования.

Я использую 1. пакет «wireless-tools» для узла 2. модуль http-сервера, который был установлен по умолчанию в узле js.

вот мой код:

function scan() {
iwlist.scan({
        iface : 'wlp1s0',
        show_hidden : true
    },
    function(err, networks) {
        return networks;
    }
    });
}

const http = require('http');

const hport = 8080;
const haddr = "localhost";
const Server = http.createServer(function(req, res){
    var n = scan();
    res.write(n);
    res.end();
});
Server.listen(hport, haddr, () => {
console.log('Server running at ' + haddr + ' ' + hport);

});

Это отображает меня неопределенным на странице.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вы влияете на немедленное возвращаемое значение iwlist.scan() в переменную n.Эта функция использует классический обратный вызов nodejs для обработки асинхронного поведения, поэтому она всегда может возвращать неопределенное значение, поскольку результат переходит в обратный вызов.

Два решения:

1) Влияет на результат переменнойвнутри обратного вызова

function scan(myCallback) {
   iwlist.scan({
      iface : 'wlp1s0',
      show_hidden : true
   }, myCallback);
});

const Server = http.createServer(function(req, res){
   var n;
   scan(function(error, result) {
      n = result;
      res.write(n);
      res.end();
   });
});

2) Вы преобразуете существующую функцию в обещание, используя Promisify

var scanAsync = utils.promisify(iwlist.scan)
function async scan() {
   // Will return the result as a promise
   return scanAsync({
      iface : 'wlp1s0',
      show_hidden : true
   });
};

try {
   var n = await scan();
} catch (e) {
   // Handle error
}
0 голосов
/ 22 февраля 2019

Пожалуйста, используйте async / await для работы с ним. Я не проверял код. Пожалуйста, проверьте код.

function scan() {
        return new Promise((resolve, reject) => {
            iwlist.scan({
                iface: 'wlp1s0',
                show_hidden: true
            },
                function (err, networks) {
                    if (err) {
                        return reject(err);
                    }
                    return resolve(networks);
                }
            );
        });

    }

    const http = require('http');

    const hport = 8080;
    const haddr = "localhost";
    const Server = http.createServer(async (req, res) => {
        try {
            var n = await scan();
            res.write(n);
            res.end();
        }
        catch (error) {
            res.write(error);
        }
    });
...