【问题标题】:RxJS stop foreach when observable meets condition当 observable 满足条件时,RxJS 停止 foreach
【发布时间】:2020-01-11 12:30:03
【问题描述】:

我有一个对象数组。我必须通过 API 调用检查每个对象,以查看该对象是否有资格获得某个促销。 在调用最后一个对象(其中 observable 应返回 false 或其中一个对象从 API 获得真实状态)之前,继续使用对象调用 API 的最佳方法是什么?

目前我将其作为代码使用,但感觉应该有更好的 RxJS 运算符方法。

checkProductForPromo(items: []) {
   const promoChecker$ = new EventEmitter<boolean>();

   items.forEach((item, key, arr) => {
        // This does a HTTP callback to the API
        this.ApiService.getProductInformation(item).subscribe(
            (product) => {
                // Based on some properties this will return true or false of the product is eligible for the promo.
                if (product.isEligibleForPromo()) {
                    promoChecker$.emit(true);
                } else if (Object.is(arr.length - 1, key)) {
                    promoChecker$.emit(false);
                }
            }
        );
    });

    return promoChecker$;
}

【问题讨论】:

    标签: typescript rxjs rxjs-pipeable-operators


    【解决方案1】:

    您可以使用 from 运算符创建 Observable:

    checkItemsForPromo(items: any[]) {
      return from(items).pipe(
        concatMap(item => this.ApiService.getProductInformation(item)),
        map(product => !!product.isEligibleForPromo()),
        takeWhile(isEligible => !isEligible, true)    
      );
    }
    

    这个 Observable 按顺序调用每个项目的 API。它在发送下一个请求之前等待上一个请求完成。 map 运算符根据需要将发射设置为truefalse

    takeWhile 表示 Observable 将继续发出 false 直到出现 true 值,此时它将完成。传递给takeWhiletrue 参数实际上是包含标志,这意味着Observable 在完成之前发出单个true 值。

    如果您只希望它在完成时发出一次false,而不是为每个不符合条件的产品,请尝试将distinctUntilChanged() 添加到pipe

    别忘了订阅这个方法返回的 Observable,必要时取消订阅。

    【讨论】:

    • 您先生,刚刚告诉我更多关于 RxJS 的信息,然后是 20 小时的 udemy 会议。非常感谢!
    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2019-05-16
    • 2020-07-13
    相关资源
    最近更新 更多