Redis "Многообещающий" в узле? - PullRequest
0 голосов
/ 29 августа 2018

Кажется, что в отличие от других репозиториев данных, которые я использую, я не могу использовать следующую стратегию в Redis:

  export class CollectPromises {
       private cachePromises: Array<Promise<any>> = [];

        public addPromise(promise: Promise<any>): void {
           this.cachePromises.push(promise);
        };

        public async executeAllPromises(): Promise<void> {
            await Promise.all(this.cachePromises);
        };
    };

Мои функции в Redis:

    async function addSingleDataToSet(key: string, data: any): Promise<boolean> {
        return new Promise<boolean>((resolve, reject) => {


            RedisManager.redisClient.sadd([key].concat(data), ((err, res: number) => {
                if(err) {
                    reject(err);
                } else {
                    resolve(res == 1);
                }
            }));
        });
    };

    async function usingRedis(x, y): Promise<void> {
        await addSingleDataToSet(x, y);
    }

И реальный код, который не должен ничего запускать перед executeAllPromises () (насколько я понимаю и как это происходит в других репозиториях)

CollectPromises.addPromise(usingRedis(x, y));
CollectPromises.addPromise(usingRedis(a, b));
CollectPromises.addPromise(usingRedis(c, d));
await CollectPromiser.executeAllPromises();

Проблема в том, что CollectPromises.addPromise (usingRedis (x, y)) (то же самое для других) запускается перед executeAllPromises (), который происходит только с использованием Redis.

Я хотел бы знать, что я делаю что-то не так или сталкиваюсь с какой-то конкретной проблемой Redis / Node.

1 Ответ

0 голосов
/ 29 августа 2018

Обещания начинают выполняться с момента их создания. В вашем примере они будут выполняться независимо от того, вызываете ли вы executeAllPromises или нет.

Вам, вероятно, будет полезно ввести концепцию Task, определяемую как функция, которая возвращает обещание. Таким образом, вы можете запустить их при необходимости.

Для этого вам нужно изменить usingRedis, чтобы он выглядел примерно так:

const usingRedis = (x, y) => () => addSingleDataToSet(x, y);

и executeAllPromises должны быть настроены для запуска задач:

await Promise.all(this.cachePromises.map(task => task()));

А затем переименуйте Promise -> Task в кучу мест.

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