Redis PubSub: обратный вызов на уровне подписчика против уровня клиента - PullRequest
0 голосов
/ 27 февраля 2020

Если я go в CLI Redis все работает нормально:

subscribe channel

publish channel test 

Это сделает волхвы c.

Дело в том, что, используя nodejs Насколько я понимаю, все работает иначе:

1 - client.on('message') получает сообщения от ВСЕХ каналов

2 - У команды subscribe есть обратный вызов, но я не может заставить его срабатывать, как это происходит в CLI, и я не понимаю, почему он существует

Если это так (только на уровне клиента), мне придется контролировать все обратные вызовы каналов с помощью я, что не так сложно, но очень сильно отличается от подхода, который существует в других инструментах, таких как Rabbit, где ваш обратный вызов находится прямо на канале.

Код очень прост c:

function callbackPS (x, y) {
    console.log(x , y)
}


            await PubSub.subscribe(canal, callbackPS)
            await PubSub.publish(canal, 'Hi');
            await PubSub.publish(canal, 'Hi 1');
            await PubSub.publish(canal, 'Hi 2');
            await PubSub.publish(canal, 'Hi 3');
            await PubSub.unsubscribe(canal);

В классе PubSub

export class PubSub {

    public static async publish(channel: string, buffer: string): Promise<number> {

        //const buffer: string = JSON.stringify(message);

        return new Promise<number>((resolve, reject) => {
            PubSub.redisPublisher.publish(channel, buffer, ((err: Error, channelsDelivered: number) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(channelsDelivered);
                };
            }));
        });
    };


    public static async subscribe(channel: string, callback: TTMessageSubscriber): Promise<boolean> {

        return new Promise<boolean>((resolve, reject) => {
            PubSub.redisPublisher.subscribe(channel, ((err: Error, channel: string) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(true);
                };
            }), channel);
        });

    };





}
...