2017-12-08 9 views
1

最新バージョンのngrx(4.1.1)と4.4.4を使用していますが、ここで問題を見つけることができず、助けが必要な場合があります。ngrxエフェクトはhttpを何度か呼び出します

私はthis.apiProvider.getLogisticsFolder()を呼び出し、http応答で動作するエフェクトを使用しています。私のレデューサーが新しい状態を返し、すべてが期待どおりに機能すると、私のレストサービスは2回目または数回呼び出されます(アクション/エフェクトは1回だけトリガーされ、残りはgetLogisticsFolder()です)。

私はここで何が欠けていますか?

@Effect() 
syncFolders$ = this.actions$ 
    .ofType<LogisticsFolderActions.SyncFolders>(LogisticsFolderActions.SYNC_FOLDERS) 
    .mergeMap(() => this.apiProvider.getLogisticsFolder() 
     .withLatestFrom(this._store.select(state => state.logisticsFolders), this._store.select(state => state.settings)) 
     .map(([cloudLogisticsFolder, localLogisticsFolderState, settingsState]) => 
     { 
      let tempLocalLogisticsFolder = localLogisticsFolderState.find(localLogisticsFolderState => localLogisticsFolderState.tenant === settingsState.baseURL); 
      if (tempLocalLogisticsFolder) 
      { 
       //now check if the folder structure has been added, deleted or changed 
       let updatedFolders = this.logisticsFolderProvider.checkAndProceedLogisticsFolderUpdate(cloudLogisticsFolder, tempLocalLogisticsFolder.logisticsFolders) 
       this.logisticsFolderProvider.checkAndProceedTasksUpdate(cloudLogisticsFolder, updatedFolders) 

       return new LogisticsFolderActions.SyncSuccess; 
      } else 
      { 
       let logisticsFolderState = <LogisticsFolder.State>{}; 
       logisticsFolderState.tenant = settingsState.baseURL; 
       logisticsFolderState.logisticsFolders = cloudLogisticsFolder; 
       return new LogisticsFolderActions.SyncSuccess({ logisticsFolder: logisticsFolderState }); 
      } 
     }) 
     .catch((error) => 
     { 
      this._store.dispatch(new AppActions.UnexpectedError(error.json().message)); 
      return Observable.of(new LogisticsFolderActions.SyncFailed) 
     }) 
    ); 

任意のヘルプ:)固定

答えて

1

をありがとう...

私は$をthis.tokenするために割り当てられ、状態が更新されたように、新しい値が実行されたトークンに加入し、私たちにはいくつかの要望がありました。

private oAuthRequest(options): Observable<any> 
    { 
     return this.token$.flatMap(token => 
     { 
      options.headers = new Headers(); 
      options.headers.append('Content-Type', 'application/json'); 
      options.headers.append('Authorization', token); 

      if (options.body && typeof options.body !== 'string') 
      { 
       options.body = JSON.stringify(options.body); 
      } 

      return this.http 
       .request(new Request(options)) 
       .map((res: Response) => 
       { 
        if (res.text) 
        { 
         return res.json(); 
        } 
        return res 
       }); 
     }).take(1); 

    } 
関連する問題