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

标签 javascript rxjs5 redux-observable

我使用 Observable.if 来确定应分派(dispatch)哪个操作。

下面的代码,由于它是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() })
      ));

最佳答案

问题在于,当参数传递给 Observable.of 时,需要对 myFunction 进行求值,并且 Observable.of 的结果是作为参数传递给 Observable.if,因此在调用 Observable.if 时对其进行求值,而不是在 Observable.if 接收 时求值下一个通知。

要解决该问题,请将其包装在 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 收到 下一个通知。

关于javascript - 使用 Observable.if 时,一个分支中的函数始终运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45791906/

相关文章:

javascript - 如何在模板文字中隐藏空字符串?

Javascript 不产生所需的输出

javascript - jquery - 将数据行索引值动态存储到数组中

javascript - 根据字段的累计和过滤元素

javascript - Angular 2 rxjs 嵌套 Observables

reactjs - 从其他史诗中调用史诗

javascript - 将 JSON 传递给 Jade 并使用相同的数据进行 API 访问

Angular - 终止 Observables 的首选方式是什么?

redux-observable - 在捕获错误时触发多个操作

javascript - 如何使用 Redux Observable 进行 EventSource