node js异步写入变量,它像wifi网络一样随机更新

node js async writting from variable which is randomly updating like wifi networks

我想在网页上显示我周围的wifi网络。 但是由于node js的异步特性。我得到未定义的值,因为它在扫描完成之前返回值。

我正在使用 1.节点'wireless-tools'包 2. node js默认自带的http server模块

这是我的代码:

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);

});

页面上显示我未定义。

请使用async/await与it.I一起工作code.Please检查代码。

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);
        }
    });

您正在影响 iwlist.scan() 的直接 return 值到 n 变量中。此函数使用经典的 nodejs 回调来处理异步行为,因此它可能始终 return 未定义,因为结果将进入回调。

两种解决方案:

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

将现有函数转换为 promise
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
}