我使用 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/