Создание списка активных соединений NodeJS - PullRequest
0 голосов
/ 22 января 2020

Я создаю приложение, которое может подключаться к системам ELK Alarm и выводить статус постановки на охрану в приложении реагирования. Я могу подключиться к панелям аварийной сигнализации, и я могу консольно регистрировать состояние постановки на охрану с помощью моего класса 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 сайтов:

enter image description here

Однако я пытаюсь получить доступ к возвращаемому значению для каждого сайта и поместить вывод в динамический массив c. Массив соединений должен храниться на моем express сервере, и мое приложение реакции должно получать оттуда статус для каждого сайта.

Как я могу получить возвращаемые значения из Alarmpanel.connect () в массив, к которому я могу получить доступ. Когда я объявляю глобальный массив, я могу получить к нему доступ и получить значения только из обратного вызова .then (). Если я получаю к нему доступ из любого другого места, я просто получаю [].

1 Ответ

0 голосов
/ 22 января 2020

Как описано в моем первом комментарии, вы не возвращаете обещание от вашей функции подключения. Это означает, что вы не можете ждать данных вне вашей функции подключения. Даже если вы устанавливаете данные глобально в then, они будут доступны только с этого момента, и я предполагаю, что ваши console.log() глобальной переменной уже напечатаны, так как вы не ожидали установления соединений sh.

Вот очень грубое исправление вашего кода:

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

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

async function connect() {
    const statuses = [
        await site1.connect(),
        await site2.connect(),
        await site3.connect(),
        await site4.connect(),
        await site5.connect(),
        await site6.connect(),
        await site7.connect(),
    ];
    console.log(statuses);
}

connect();

Я специально не использую какие-либо причудливые обещания, но вы можете посмотреть на Promise.all, чтобы улучшить это. код!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...