@angular @ ngrx / effects HTTP请求继续取消并重试

时间:2017-07-31 17:07:49

标签: angular ngrx ngrx-effects

我有一个非常简单的效果,可以生成一个http请求,并在完成后调度一个动作。

HTTP请求不断被取消并反复重新制作。

enter image description here

最初我以为导致问题的是switchMap(取消了observable),所以我尝试使用mergeMap(结果相同)。

以下是我的效果代码。

signIn$ = this.actions$
  .ofType(ACTIONS.AUTH.SIGN_IN)
  .map(toPayload)
  .map(payload => toInput(payload))
  .switchMap(input => this.http
      .post<Output>(`${GLOBALS.endpoint}/auth/authenticate`, input)
      .map(output => ({ type: ACTIONS.APP.PUSH_NOTIFICATION, payload: "test" }))
      .catch(error => of(createAction(ACTIONS.APP.LOG_EXCEPTION, error)))
  );

上面的代码编译没有错误并按预期工作,除了它不断取消和重新生成http请求的事实。

我不知道它是否重要,但我使用的是HttpClient(@ angular / common / http),而不是@ angular / http。

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:5)

“switchMap”有自己的“取消订阅”机制 取消api请求,

使用“flatMap”(或mergeMap)代替应该适合你。

答案 1 :(得分:1)

看起来您在短时间内多次发送相同的请求。尝试仅在令牌更改时限制请求。以下可能有效:

signIn$ = this.actions$
  .ofType(ACTIONS.AUTH.SIGN_IN)
  .distinctUntilChanged()
  .map(payload => toInput(payload))
  .switchMap(input => this.http
      .post<Output>(`${GLOBALS.endpoint}/auth/authenticate`, input)
      .map(output => ({ type: ACTIONS.APP.PUSH_NOTIFICATION, payload: "test" }))
      .catch(error => of(createAction(ACTIONS.APP.LOG_EXCEPTION, error)))
  );