ngrxでログアウトした後に発生するすべてのディスパッチアクションをブロックするにはどうしたらいいですか?このロジックを処理するルートディスパッチャがありますか?Ngrxはログアウトアクション後にディスパッチされたアクションをキャンセルします
1
A
答えて
0
私はMaxime's commentでこの回答に基づいていますので、うまくいけば私はあなたの要件を正しく理解しました。
数日前に同様の要件がありました。は、アプリケーション状態に基づいて実行中のエフェクトからのアクションディスパッチを防止します。
さらに、私はこのロジックを多くのエフェクトで使用するために何かが必要なので、使用するのは簡単でなければなりませんでした。
私の解決策は、実行中のリクエストが終了したらエフェクトチェーンをフィルタリングすることでした。したがって、ユーザーがログアウトすると、応答は無視されます。
まず、私はこの「ignore'ロジックをラップするヘルパークラスを作成しました:
効果-helper.ts
import { Injectable } from '@angular/core';
import { Store } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';
import { AppState } from 'app/reducers/root.reducer';
@Injectable()
export class EffectHelper {
constructor(private store: Store<AppState>) { }
ignoreWhenLoggedOut<T>() {
return (source): Observable<T> => source
// get current app state
.withLatestFrom(this.store, (result, state) => ({ result, state }))
// only continue when user is logged in
.filter(combined => combined.state.auth !== undefined)
// pass on the result of the request when user is logged in
.map(combined => combined.result);
};
}
ときignoreWhenLoggedOut
方法が観察シーケンスとフィルタを取りますauth
- グローバルなapp-stateのスライスはundefined
です。 (私の場合は、未定義の認証状態とは、ユーザーがログインしていないことを意味します)。
ヘルパーは今例えば、任意の効果で使用できます。
私-effects.ts
import * as web from 'app/actions/web.action';
import { EffectHelper } from 'app/shared/effects-helper';
@Injectable()
export class MyEffects {
@Effect() getWebRequest$ = this.actions$
.ofType(web.WEB_REQUEST)
.map((action: web.WebRequestAction) => action.input)
.switchMap(input => this.svc.getWebRequest(input)
/*
* inject the ignore-logic into the effect
* notice that helper gets typed, so we have typesafety down the chain
*/
.let(this.effectHelper.ignoreWhenLoggedOut<MyResultType>())
// this continues only when user is logged in
.map(result => new web.WebSuccessAction(result))
.catch(error => {
return Observable.of(new web.WebFailureAction(error));
})
);
constructor(
private actions$: Actions,
private svc: WebService,
// inject effect-helper
private effectHelper: EffectHelper
) { }
}
あなたが見ることができるように、私は今、さらに派遣から任意の実行中の影響を防ぐことができますlet
- オペレーターのおかげで、1ライナーのアクション
(ほかのサービスと同じように、モジュールにEffectHelper
を提供することを忘れないでください)。
関連する問題
- 1. ngrx /エフェクトがマップされたアクションをディスパッチしない
- 2. ngrxエフェクトから同じアクションを複数回ディスパッチする方法
- 3. コンポーネントからアクションがディスパッチされたときにngrxエフェクトが呼び出されない
- 4. ngrx/effectsでアクションをディスパッチしないときに無限ループに陥る
- 5. ディスパッチされたアクションからサンクを中止できますか?
- 6. 2番目のアクションをディスパッチするアクションがディスパッチされた後に1つのストアが完了するまで待つ方法
- 7. アクション/エフェクトUI通知後のngrx/store
- 8. Angular4/ngrx - ExpressionChangedAfterItHasBeenCheckedError:チェックされた後に式が変更されました
- 9. アクションが完了した後のNgrxリセットフォーム入力
- 10. OpenQueryアクションがキャンセルされました。エラーコード800A09C5
- 11. mapStateToPropsは、アクションのディスパッチ
- 12. アクション作成者が呼び出されましたが、アクションがディスパッチされません
- 13. アポロ反応クエリー後のアクションのディスパッチ
- 14. コールバックでアクションをディスパッチ
- 15. reducex-mock-storeストアの状態がアクションのディスパッチ後に更新されない
- 16. 再販されました。キャンセル後のタイマーは「java.lang.IllegalStateException:Timer cancelled」を返します。
- 17. jest redux-thunk test同じモジュールのアクションがディスパッチされた場合
- 18. アクションの配列をディスパッチすることも、ngrxエフェクトからナビゲートすることもできますか?
- 19. レデューサーでアクションをディスパッチできますか?
- 20. アクションがディスパッチされた後にReduxストアの特定のプロパティ変更をリッスンする方法
- 21. Redux - アクションを正しくディスパッチする
- 22. 空のアクションをディスパッチする方法は?
- 23. ディスパッチされたアクションのデータを使用するサガをテストする方法
- 24. componentDidMountにアクションをディスパッチする(react/redux)
- 25. 要求が中止されました:要求がキャンセルされました:要求がキャンセルされました
- 26. ボイラープレートに反応:ディスパッチされたアクションはサガで縮小されていません
- 27. リアクションネイティブレビュックスでレンダリングする前にアクションをディスパッチしますか?
- 28. アクションが2回ディスパッチされたときにのみ、状態がコンポーネントにプッシュされます
- 29. ウィンドウイベントリスナーからアクションをディスパッチ
- 30. ディスパッチ自己アクションをタイムアウトで
ストアに直接ディスパッチされたアクションをブロックすることはできません。 [this](https://stackoverflow.com/q/40870990/6680611)のコメントに関するコメントを参照してください。 – cartant
私は彼が実際の行動ではなくエフェクトの実行をキャンセルしたいと思う。たとえば、ペイロード '{newName: 'いくつかの新しい名前'}'でアクションUPDATE_PROFILEをディスパッチした場合、エフェクトの1つがキャッチしてAPIにHTTP呼び出しを行います。しかし、それは長い時間がかかると、ユーザーが切断をクリックして要求を言う。切断された後に前のリクエストが終了しても、(クリーニングされた)ストアは更新されます。 – Maxime
@Maximeはい、まさに私が今直面している問題です –