使用 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
通知。
我正在使用 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
通知。