【发布时间】:2020-01-21 21:31:01
【问题描述】:
我正在构建一个可以连接到 ELK 警报系统并在反应应用程序中输出布防状态的应用程序。我可以连接到警报面板,并且可以使用我的 Alarmpanel 类控制台记录布防状态:
const elkClient = require('elk-client');
class Alarmpanel {
constructor(siteName, zoneName, host, port, secure, area) {
this.siteName = siteName;
this.zoneName = zoneName;
this.host = host;
this.port = port;
this.secure = secure;
this.area = area;
this.armed;
}
set armStatus(state) {
this.armed = state;
return state;
}
connect() {
const ElkClient = elkClient.ElkClient;
let client = new ElkClient({
connection: {
name: this.zoneName,
host: this.host,
port: this.port ,
secure: this.secure,
}
});
client
.connect()
.then(() => client.getArmingStatus())
.then((data) => {
const armingdata = data.areas[this.area].armUpState;
const armBool = this.armingState(armingdata);
const panelInfo = {
name: this.siteName,
armed: armBool
}
console.log(panelInfo);
return panelInfo;
})
.catch((err) => console.log("----Connection Error --------"));
}
armingState(data) {
if(data === 49) {
this.armStatus = false;
return this.armed;
} else if (data === 50) {
this.armStatus = false;
return this.armed;
} else if (data === 51) {
this.armStatus = true;
return this.armed;
} else if (data === 52) {
this.armStatus = true;
return this.armed;
} else if (data === 53) {
this.armStatus = true;
return this.armed;
} else if (data === 54) {
this.armStatus = true;
return this.armed;
} else if (data === 48) {
this.armStatus = false;
return this.armed;
}
}
}
const site1 = new Alarmpanel("Site1", "Main House", IP , PORT, true, 0);
const site2 = new Alarmpanel("Site2", "Exterior", IP, PORT, true, 1);
const site3 = new Alarmpanel("Site3", "Exterior", IP, PORT, true, 2);
const site4 = new Alarmpanel("Site4", "Guest House", IP , PORT, true, 3);
const site5 = new Alarmpanel("Site5", "Main House", IP, PORT, true, 0);
const site6 = new Alarmpanel("Site6", "Exterior", IP, PORT, true, 1);
const site7 = new Alarmpanel("Site7", "Main House", IP, PORT, true, 0);
site1.connect();
site2.connect();
site3.connect();
site4.connect();
site5.connect();
site6.connect();
site7.connect();
当我在控制台登录时,我会为 7 个站点中的每一个都获得正确的“待命状态”:
但是,我正在尝试访问每个站点的返回值并将输出放入动态数组中。连接数组应该保存在我的 express 服务器上,我的 react 应用程序应该从那里获取每个站点的状态。
如何将 Alarmpanel.connect() 的返回值放入我可以访问的数组中。当我声明一个全局数组时,我只能访问它并从 .then() 回调中获取值。如果我从其他任何地方访问它,那么我只会得到 []。
【问题讨论】:
-
你没有在 connect() 中返回你的 Promise,你应该这样做!
return client.[...]。然后,您可以在异步函数中连续获取每个警报系统的状态:await site1.connect(); await site2.connect();等。然后您可以将变量存储在 then 中(如果您想要但不理想,可以在全局范围内),或者只是将它们返回到然后将它们分配到外面。
标签: javascript node.js express asynchronous promise