根据反应功能范式

时间:2016-12-21 10:29:21

标签: rxjs reactive-programming rxjs5

我有以下功能:

switchMap

第一个参数只是一个可观察对象,第二个参数是一个对象。

查看.switchMap(function (oCalendar) { return oEditButton.getPressed()? Rx.Observable.of(oCalendar) : Rx.Observable.never(); }) 方法,我问是否按下按钮。

我的问题是,当我在封闭内部询问按钮状态时,我是否打破了反应功能范式?

let dateFormatter = NSDateFormatter()
 dateFormatter.locale = NSLocale(localeIdentifier: "en_US")

1 个答案:

答案 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();
    });

(这不解决最初的问题,只是旁边的一个提示)