节点js从变量随机写入,该变量像wifi网络一样随机更新

时间:2019-02-22 12:38:46

标签: node.js http server wifi

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

我正在使用 1.节点“无线工具”包 2.节点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);

});

它在页面上显示的是未定义状态。

2 个答案:

答案 0 :(得分:0)

请使用async / await来处理它。我尚未测试代码。请检查代码。

#include <iostream>
#include <functional>

void foo(int i)
{
    std::cout << "fo is called with: " << i << "\n";
}

int main()
{
    std::function<void(int)> fo = std::bind(foo, std::placeholders::_1); // or &foo, both work
    std::function<void(int)> fo2 = std::bind(fo, std::placeholders::_1); // Error if &fo is used
    fo2(5);
}

答案 1 :(得分:0)

您正在影响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
}