@YagoRkO

Как собрать данные из двух одновременных событий в один объект на Nodejs?

Доброго дня. Подключаюсь к Asterisk с помощью библиотеки asterisk-ami-client.
Мониторю очередь на входящие звонки и пытаюсь собрать данные из двух разных событий в один объект.
При первом событии AgentConnect создаю в Redis ключ-значение с первичными данными о звонке.
При окончании звонка события AgentComplete и Cdr приходят одновременно и мне нужно собрать из них данные.
В этих двух событиях первым делом получаю существующие данные из Redis, дополняю объект и пишу обратно.
В итоге в обоих событиях получаю неполный объект, который в таком же виде записывается в базу.
Перед записью в базу проверяю объект на полноту, но и тут промах. Как собрать данные из двух событий в один объект и по окончанию сборки записать??
Видимо не хватает навыков программирования или понимания алгоритма. Просветите пожалуйста.
module.exports = function (AmiClientConn, AmiClient, redisClient, queue_list, queue_member_list, RestClient, settings) {
    const {promisify} = require("util");
    const fs = require("fs");
    let hmgetAsync = promisify(redisClient.hmget).bind(redisClient)
    let hmsetAsync = promisify(redisClient.hmset).bind(redisClient)

    AmiClientConn.then(() => {

        AmiClient.on('AgentConnect', async event => {
            console.warn(event.Event, event.Uniqueid);
            let call_obj = {
                calltime: '',
                number: event.CallerIDNum,
                queue: event.Queue,
                dialstatus: '',
                uniqid: event.Uniqueid,
                talktime: '',
                holdtime: event.HoldTime,
                reason: '',
                agnum: event.MemberName
            }
            let redis_agent_connect_obj_string = JSON.stringify(call_obj);
            console.warn(event.Event, event);

            let redis_result = await hmsetAsync(`agentconnect`, {[event.Uniqueid]: redis_agent_connect_obj_string})
            console.log('AgentConnectRedis', redis_result)

        });

        AmiClient.on('AgentComplete', async event => {
            let agent_connect_complete_data_string = await hmgetAsync(`agentconnect`, event.Uniqueid)

            if (agent_connect_complete_data_string[0] !== null) {
                let agent_connect_complete_data_obj = JSON.parse(agent_connect_complete_data_string[0]);
                console.log('ПОЛУЧИЛ ДАННЫЕ В AgentComplete', agent_connect_complete_data_obj)
                let redis_agent_complete_data_obj = {
                    ...agent_connect_complete_data_obj,
                    talktime: event.TalkTime,
                    reason: event.Reason
                };

                let redis_agent_complete_data_obj_string = JSON.stringify(redis_agent_complete_data_obj)
                let redis_result = await hmsetAsync(`agentconnect`, {[event.Uniqueid]: redis_agent_complete_data_obj_string})
                console.log('AgentCompleteRedis', redis_result);



                let last_redis_complite_check_string = await hmgetAsync(`agentconnect`, event.Uniqueid)
                let last_redis_complite_check_obj = JSON.parse(last_redis_complite_check_string);

                let rest_agent_complete_data_obj = {
                    data: {
                        ...last_redis_complite_check_obj
                    },
                    headers: {"Content-Type": "application/json"}
                };

                console.log('ОБЪЕКТ В AGENTCOMPLETE', last_redis_complite_check_obj)
                if (last_redis_complite_check_obj.calltime !== '') {
                    await RestClient.post(`${settings.serverUri}/callin/create`, rest_agent_complete_data_obj, function (data, response) {
                        console.log('СОЗДАНИЕ ЗАПИСИ В АГЕНТКОМПЛИТ', data);
                        fs.appendFile("call_logger.txt", `${JSON.stringify(data)}\n`, function (error) {
                            if (error) throw error; // если возникла ошибка
                            console.log("Асинхронная запись файла завершена.");
                        })
                    })
                }
            }
        });

        AmiClient.on('Cdr', async event => {setTimeout()
            let agent_connect_cdr_data_string = await hmgetAsync(`agentconnect`, event.UniqueID)

            if(agent_connect_cdr_data_string[0] !== null) {
                let agent_connect_cdr_data_obj = JSON.parse(agent_connect_cdr_data_string[0]);
                console.log('ПОЛУЧИЛ ДАННЫЕ В Cdr', agent_connect_cdr_data_obj)
                if(agent_connect_cdr_data_obj.calltime === '') {
                    let redis_agent_cdr_data_obj = {
                        ...agent_connect_cdr_data_obj,
                        calltime: event.StartTime,
                        dialstatus: event.Disposition
                    };

                    let redis_agent_cdr_data_obj_string = JSON.stringify(redis_agent_cdr_data_obj)
                    let redis_result = await hmsetAsync(`agentconnect`, {[event.UniqueID]: redis_agent_cdr_data_obj_string})
                    console.log('AgentCdrRedis', redis_result)

                    let last_redis_cdr_check_string = await hmgetAsync(`agentconnect`, event.UniqueID)
                    let last_redis_cdr_check_obj = JSON.parse(last_redis_cdr_check_string);

                    let rest_agent_cdr_data_obj = {
                        data: {
                            ...last_redis_cdr_check_obj
                        },
                        headers: {"Content-Type": "application/json"}
                    };

                    console.log('ОБЪЕКТ В CDR', last_redis_cdr_check_obj)
                    if (last_redis_cdr_check_obj.talktime !== '') {
                        await RestClient.post(`${settings.serverUri}/callin/create`, rest_agent_cdr_data_obj, function (data, response) {
                            console.log('СОЗДАНИЕ ЗАПИСИ В СДР', data);
                            fs.appendFile("call_logger.txt", `${JSON.stringify(data)}\n`, function (error) {
                                if (error) throw error; // если возникла ошибка
                                console.log("Асинхронная запись файла завершена.");
                            })
                        })
                    }
                }
            }
        });


    })
        .catch(error => console.log(error))
}
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Che603000
c 2011 javascript
используйте промисы https://learn.javascript.ru/promise
Promise.all(promis1, promis2) // разрешится когда сработает каждый из промисов
.then(datas=>{
  // здесь можно получить данные, преобразовать и записать в db
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы