使用 Rx 放入/取出篮子
Put in / remove from the basket using Rx
我有两个数据流:
- 布尔流,指示商品是否存在于购物篮中。
- 点击流,启动项目 put/delete into/from 篮子。
首先,我想根据布尔流更改切换按钮的标题。这很简单。其次,我想结合布尔流的最新值和点击流的事件,以启动放置或删除请求。
这是我目前尝试过的方法:
// 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 并在 Next 上更新它),但我认为它不符合功能,必须有一个组合来处理这个问题而无需额外 fields/variables。
谢谢。
P.S。两个 observables 都很热
看看withLatestFrom
。它只会在主要来源发出并结合其他来源的最新值时传播。
ViewObservable.clicks(mPurchaseButton)
.withLatestFrom(inBasketStream,
(dontCare, inBasket) -> inBasket)
.subscribe(/*do your update*/);
我有两个数据流:
- 布尔流,指示商品是否存在于购物篮中。
- 点击流,启动项目 put/delete into/from 篮子。
首先,我想根据布尔流更改切换按钮的标题。这很简单。其次,我想结合布尔流的最新值和点击流的事件,以启动放置或删除请求。
这是我目前尝试过的方法:
// 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 并在 Next 上更新它),但我认为它不符合功能,必须有一个组合来处理这个问题而无需额外 fields/variables。
谢谢。
P.S。两个 observables 都很热
看看withLatestFrom
。它只会在主要来源发出并结合其他来源的最新值时传播。
ViewObservable.clicks(mPurchaseButton)
.withLatestFrom(inBasketStream,
(dontCare, inBasket) -> inBasket)
.subscribe(/*do your update*/);