node.js - 节点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);
});
它在页面上显示我未定义。
解决方案
您正在影响变量的立即返回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
}
推荐阅读
- python - 如何在pycharm社区v2018.3.6中运行unittest
- windows - 如何在 Perl 中打印 Hexagram?
- php - 无法从 Symfony 服务访问 dotenv 变量
- linux - 获取 E175002:服务器发送了意外的返回值(500 内部服务器错误)以响应 '/svn/repo/!svn/me' 的 POST 请求
- c++ - 使用 CPLEX C++ API 在回调中获取松弛值
- html - 移动设备上的 Outlook 365 模糊签名图像(高 DPI 问题)
- r - 根据单个列的内容将数据行添加到 tibble
- android - 在单个活动中替换片段的奇怪行为
- arm - SIMD 微架构
- google-apps-script - 在已发布的 Google 表格中导航