使用Rx放入篮子/从篮子中取出

时间:2015-06-24 07:33:44

标签: reactive-programming rx-java frp rxjs rx-android

我有两个数据流:

  1. 布尔流,指示项目是否存在于购物篮中。
  2. 点击流,启动项目放入/从篮子中删除。
  3. 首先,我想根据布尔流更改切换按钮的标题。这很简单。其次,我想结合布尔流中的最新值和Clicks流中的事件,以启动put或delete请求。

    这是我到目前为止所尝试的内容:

    // handling the toggle button caption
    inBasketStream.subscribe(inBasket -> {
        mPurchaseButton.setText(inBasket ? "Already in basket" : "Purchase");
    });
    
    // handling clicks and deciding whether to add or remove item
    Observable.combineLatest(
            inBasketStream,
            ViewObservable.clicks(mPurchaseButton),
            (inBasket, onClickEvent) -> inBasket).subscribe(inBasket -> {
                if (inBasket) {
                    mRemoveFromBasket.call(mItemId);
                } else {
                    mAddInBasket.call(mItemId);
                }
            }
    );
    

    然而,combineLatest不能完成我的工作。相反,它会导致递归,因为至少发生了一次点击事件,并且在操作完成时更新了inBasketStream。 Zip也无济于事,因为篮子流可能会从另一个地方改变,因此,有一个堆叠多个布尔值的场景,这将使zip变得过时(只是下一个,而已经有更多的值)下一次点击事件的价值。

    所以,我需要一种方法从布尔流中获取最后一个值,并在发生点击事件时使用它。当然,我可以使用一个布尔字段(订阅inBasketStream并将其更新为onNext)但我觉得它不符合功能,并且必须有一个组合来处理这个问题而不需要额外的字段/变量。

    感谢。

    P.S。两个观察者都很热

1 个答案:

答案 0 :(得分:2)

看看withLatestFrom。它只会在主要源发出时传播,同时组合来自其他源的最新值。

ViewObservable.clicks(mPurchaseButton)
              .withLatestFrom(inBasketStream, 
                             (dontCare, inBasket) -> inBasket)
.subscribe(/*do your update*/);