2017-08-21 6 views
0

Observable.ifを使用して、どのアクションをディスパッチするかを決定しています。Observable.ifを使用すると、1つのブランチの機能が常に実行されます。

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

「Observable.defer」で囲みます。 'defer'がなければ、' Observable.if'が構成されているときに値がObservable.ofに渡されるときに呼び出されなければなりません。 'Observable.defer(()=> Observable.of({type: 'ACTION2'、payload:myFunction()}))' – cartant

+0

うわー、うまくいきました。 –

答えて

1

問題は、引数がObservable.ofに渡され、Observable.ofの結果は、引数としてObservable.ifに渡されたとき、Observable.ifが呼び出されたときに評価されますので、myFunctionニーズが、評価されるということである - ないときObservable.ifnext通知を受信します。

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.ifnext通知を受信するまでObservable.ofの呼び出し(およびmyFunctionすることが呼び出し)を次いで遅延されます、この問題を解決するObservable.deferコールでそれをラップする

関連する問題