我有一个显示错误消息的标签。如果你双击它,你会得到一个显示整个堆栈跟踪的大对话框。我有两个observable:一个用于错误,一个用于点击事件:
final ConnectableObservable<Notification> errorNotifications = pm
.getNotificationObservable()
.filter(notification -> notification.getType().isError() && !notification.getLongMessage().isEmpty())
.replay(1);
errorNotifications.connect();
SwingObservable.fromMouseEvents(dialog.getMessagePanel().getMessageLabel())
.map(MouseEvent::getClickCount)
.filter(number -> number >= 2)
.subscribe(integer -> errorNotifications
.take(1)
.subscribe(notification -> ErrorDialog.showError(dialog.getFrame(), "Error", notification.getLongMessage())));
我过滤通知observable只显示错误并重播最后一个错误,如果我从我的click observable中订阅它。
现在我的问题是,RxJava中是否有任何运算符,我可以通过它来做更多...整洁地?我尝试使用combineLatest()
,但这有效果,每次出现错误时,对话框都会打开。
以更抽象的方式:我有两个observable,一个像“master”:如果master observable(click observable)发出一个项目,另一个observable(我的错误通知)应该发出最新的项目。
答案 0 :(得分:2)
在订阅中使用其他Observable
通常是一个设计缺陷。
您可以在此response中查看flatMap
运算符。当您发出另一个事件时,它将帮助您发出错误通知。
例如,如果您想在代码中使用flatMap
运算符,可以像这样更新:
final ConnectableObservable<Notification> errorNotifications =
pm.getNotificationObservable()
.filter(notification -> notification.getType().isError() && !notification.getLongMessage().isEmpty())
.replay(1);
errorNotifications.connect();
SwingObservable.fromMouseEvents(dialog.getMessagePanel().getMessageLabel())
.map(MouseEvent::getClickCount)
.filter(number -> number >= 2)
.flatMap(integer -> errorNotifications.take(1))
.subscribe(notification -> ErrorDialog.showError(dialog.getFrame(), "Error", notification.getLongMessage())));