我有以下功能:
switchMap
第一个参数只是一个可观察对象,第二个参数是一个对象。
查看.switchMap(function (oCalendar) {
return oEditButton.getPressed()? Rx.Observable.of(oCalendar) : Rx.Observable.never();
})
方法,我问是否按下按钮。
我的问题是,当我在封闭内部询问按钮状态时,我是否打破了反应功能范式?
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US")
答案 0 :(得分:1)
在不知道你的流是如何被触发的情况下,这在技术上是好的,但是正如你可能已经猜到的那样,你通过引入一个非流状态来破坏拥有纯粹无状态函数的“精神”, oEditButton
- 每次都不能保证流与相同的输入具有相同的结果,因为存在一些“外部”状态(按下或不按下按钮)。
因此,“更清晰”的方法(不确定是否适用于您的应用程序)具有类似oEditButtonClicked$
- 事件流的内容,这将触发所选日期的处理。
oEditButtonClicked$
.switchMapTo(oCalenderSelect$)
.mergeMap(cal => Rx.Obserbalbe.from(cal.getSource....))
作为旁注,如果您无法引入该事件流,您仍然可以使用skipWhile
来改进您的代码:
return oCalendarSelectOb
.skipWhile(() => oEditButton.getPressed())
.mergeMap(function (oCalendar) {
return Rx.Observable.from(oCalendar.getSource().getSelectedDates());
})
.map(function (oDateRange) {
return oDateRange.getStartDate();
});
(这不解决最初的问题,只是旁边的一个提示)