11

Angular2 と ngrx/store および ngrx/effects を状態管理に使用しています。

@Effects()特定のアクションが失敗したときにエラー メッセージを表示したいのですが、このタスクをブロックで実行できないようです。以下を参照してください。

  @Effect() selectOfficeFail$ = this.actions$
   .ofType(SelectOfficeActions.LOAD_FAIL)
   .do(() => {
     alert('Error! No offices found!'); // I keep entering here
  });

上記のコードを実行すると、ブラウザーがクラッシュするまでアラートが無限に実行されます。新しいもの@Effect() 返さdispatch()なければならないようですが、理由がわかりません。上記の alert() が何度も実行されるのはなぜですか?

編集:私は複数回発送していません。SelectOfficeActions.LOAD_FAIL1回だけ

4

4 に答える 4

6

問題はdo、アクションがエフェクトを通過できるようになり、アクションが再びストアによってディスパッチされることです。filterそれを防ぐために使用できます:

@Effect() selectOfficeFail$ = this.actions$
  .ofType(SelectOfficeActions.LOAD_FAIL)
  .do(() => {
    alert('Error! No offices found!'); // I keep entering here
  })
  .filter(() => false); 
于 2016-08-25T12:55:56.553 に答える
2

はい@effect、新しいアクションをディスパッチする必要があるのは正しいですが、アプリケーション ロジックに何か問題があると思います。

コンポーネントまたはサービスでアクションをディスパッチするのSelectOfficeActions.LOAD_FAILではなく、 を呼び出す LOAD アクションを@Effectディスパッチし、その効果が条件に基づいてLOAD_COMPLETEまたはをディスパッチする必要があります。LOAD_FAIL

ライブラリgithubからのこの例のようなもの

 @Effect() login$ = this.updates$
      // Listen for the 'LOGIN' action
      .whenAction('LOGIN')
      // Map the payload into JSON to use as the request body
      .map(update => JSON.stringify(update.action.payload))
      .switchMap(payload => this.http.post('/auth', payload)
        // If successful, dispatch success action with result
        .map(res => ({ type: 'LOGIN_SUCCESS', payload: res.json() }))
        // If request fails, dispatch failed action
        .catch(() => Observable.of({ type: 'LOGIN_FAILED' }));
      );
于 2016-08-25T12:42:33.007 に答える