【问题标题】:RxJS operator to subscribe to a new source only if the first source is empty?仅当第一个源为空时,RxJS 运算符才订阅新源?
【发布时间】:2019-12-26 05:57:25
【问题描述】:

我试图弄清楚如何使用 RxJS 6 检查缓存中的值,并且只有在缓存中未找到该值时,才从数据库中请求该值。理想情况下,我可以将从数据库接收到的值添加到缓存中。

到目前为止,我已经查看了race,但这将同时请求两者并采取先响应者。如果缓存中的值可用,我不想从数据库请求。 flatMap 好像有同样的问题?

我知道defaultIfEmpty,但它只提供默认的,而不是订阅新的 Observable 并发出这些值。

【问题讨论】:

    标签: rxjs6


    【解决方案1】:

    我认为您在这里寻找的操作员是defer,根据工厂创建功能,它实际上不会在订阅时间之前创建被订阅的observable。您还没有发布代码,但以伪代码形式它看起来像这样:

    const getValue$ = (value: number) => defer(() => {
        const cachedValue = checkCache(value);
        if (cachedValue) {
            return of(cachedValue);
        } else {
            return this.db.get(value).pipe(
                mergeMap(dbReturnedValue => addToCache(dbReturnedValue))
            );
        }
    });
    
    // later in code:
    getValue$(testValue).subscribe(
        data => doSomething(data),
        err => processError(err)
    );
    

    【讨论】:

    • 延迟成功了。这是一个 Stackblitz 展示了一个完整的功能示例:stackblitz.com/edit/rxjs-e9yfmd。更改 checkCache 的返回值以在从缓存检索和从数据库检索之间切换
    • 不错!使用 StackBlitz 进行测试很好。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2016-12-10
    • 1970-01-01
    相关资源
    最近更新 更多