使用Observable.if时,一个分支中的函数始终运行

时间:2017-08-21 07:55:31

标签: javascript rxjs5 redux-observable

我正在使用Observable.if来确定应该调度哪个操作。

以下代码,因为它是true,所以只调度ACTION1,这是正确的。

但是,我发现myFunction()也在运行,我没想到。

任何解释都会很棒。感谢

myFunction() {
  console.log('I did not expect this run');
  return 1;
}

export const myEpic = (action$, store) =>
  action$
    .ofType('ACTION')
    .mergeMap(() =>
      Observable.if(
        () => true,
        Observable.of({ type: 'ACTION1' }),
        Observable.of({ type: 'ACTION2', payload: myFunction() })
      ));

1 个答案:

答案 0 :(得分:1)

问题是当参数传递给myFunction并且Observable.of的结果作为参数传递给Observable.of时需要评估Observable.if,所以它是在Observable.if被调用时进行评估 - 而不是在Observable.if收到next通知时进行评估。

要解决此问题,请将其打包在Observable.defer电话中:

import 'rxjs/add/observable/defer';
// ...
export const myEpic = (action$, store) =>
  action$
    .ofType('ACTION')
    .mergeMap(() =>
      Observable.if(
        () => true,
        Observable.of({ type: 'ACTION1' }),
        Observable.defer(() => Observable.of({ type: 'ACTION2', payload: myFunction() }))
      ));

Observable.of的呼叫(以及对myFunction的呼叫)将被推迟到Observable.if收到next通知。