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

Function in one branch always runs when use Observable.if

我正在使用 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() })
      ));

问题是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 通知。