我正在使用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() })
));
答案 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
通知。