2

我有一个非常简单的效果,它发出一个 http 请求并在完成时分派一个动作。

HTTP 请求不断地被取消和一遍又一遍地重新制作。

在此处输入图像描述

最初我认为是 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。

任何建议将不胜感激!

4

2 回答 2

6

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

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

于 2018-01-03T10:24:44.163 回答
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)))
  );
于 2017-07-31T17:11:39.407 回答