【发布时间】:2019-02-03 17:00:58
【问题描述】:
似乎和我使用的其他数据仓库不同,我在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)) (与其他相同)在仅使用 Redis 发生的 executeAllPromises() 之前被触发。
我想知道我是做错了什么还是面临一些特定的 Redis/Node 问题。
【问题讨论】:
-
问题是 CollectPromises.addPromise(usingRedis(x, y)) (与其他人相同)在 executeAllPromises() 之前被触发 - 这是一个问题吗?这就是 Promise.all 的用途。如果它不能满足您的需求,那么您可能不需要它。请澄清什么是理想的行为。 Redis请求应该一个接一个地发出吗?另外,CollectPromises 是一种奇怪的抽象,它不应该存在,这可以用普通的 JS 来完成。没有可承诺或不可承诺的事情。如果那是您的要求,那么您的承诺是正确的。还有承诺的 Redis 包。
-
该函数在我将它推送到数组时触发,在 await Promise.all 之前
-
这是意料之中的。你没有解释为什么这是一个问题。