我正在尝试在网页上显示我周围的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);
});
它在页面上显示的是未定义状态。
答案 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
将现有功能转换为Promisevar 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
}