2017-12-03 18 views
0

ObservablesとReactive Programming rxjsの新機能です。リアクション/レクセス・アプリケーションにライブラリredux-observableを追加しました。startWith operator Rxjsが期待どおりに動作しない

ログイン処理の叙事詩を作成しました。基本的には、LOGIN_REQUESTアクションが実行されると、最初はSET_LOADINGアクションを起動し、操作中は回転ホイールを表示します完了したら、サーバーにユーザーを取得するために休憩を要求します。

これは私が書いたコードです:

const loginEpic = (action$) => { 
    console.log('EPIC LOGIN EXECUTED'); 
    return action$.filter(action => action.type === LOGIN_REQUEST) 
     .mergeMap(action => ajax.post(getUrl(constants.LOGIN), 
      action.payload)) 
     .map(response => setUser(response.response)) 
     .takeUntil(action$.ofType(LOGIN_REQUEST_CANCELLED)); 
     .startWith(setLoading(true)); 
}; 

私は(これは私が期待する動作です)とすぐにLOGIN_REQUESTが発射されるSET_LOADINGアクションを起動するためにオペレータstartWithを使用しています。 しかし、アプリケーションが最初にロードされたときに、以前のLOGIN_REQUESTアクションを使用せずにSET_LOADINGアクションが起動される理由はわかりません。

問題がstartWith演算子に関連していることはわかっています。これを削除すると、SET_LOADINGアクションは起動されないためです。だから、私は何が間違っているの?このSET_LOADINGアクションがLOGIN_REQUESTアクションの後だけでなく、常に起動されるのはなぜですか?

おかげ

+0

私はあなたが.startWith演算子が何を誤解することができると思います。 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html 例では、setLoading(true)が直ちに呼び出され、その戻り値が観測可能なストリームに入ります – wywong

答えて

3

エピックだけで観測可能であり、それはそれが派遣されるアクションを生成するたびに。このようにstartWithを使用すると、誰でも購読を開始するとすぐにsetLoadingActionが受信されることになります。代わりに、フィルタがtrueの場合にのみloadingActionを発生させる必要があります。これらの線に沿って

何か:

const loginEpic = (action$) => { 
    console.log('EPIC LOGIN EXECUTED'); 
    return action$.filter(action => action.type === LOGIN_REQUEST) 
     .mergeMap(action => Observable.merge(
       Observable.of(setLoading(true)), 
       Observable.fromPromise(ajax.post(getUrl(constants.LOGIN), 
        action.payload)) 
     .map(response => setUser(response.response)) 
     .takeUntil(action$.ofType(LOGIN_REQUEST_CANCELLED))); 
}; 
関連する問題