首页 > 解决方案 > 节点js异步写入变量,该变量像wifi网络一样随机更新

问题描述

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

我正在使用 1. node 'wireless-tools' 包 2. 默认情况下在 node js 中提供的 http 服务器模块。

这是我的代码:

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

});

它在页面上显示我未定义。

标签: node.jshttpserverwifi

解决方案


您正在影响变量的立即返回iwlist.scan()n。此函数使用经典的 nodejs 回调来处理异步行为,因此它可能总是返回 undefined,因为结果将进入回调。

两种解决方案:

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
}

推荐阅读