Angular retryWhen 条件状态码

Angular retryWhen with condition statuscode

我对 retryWhen 有疑问。

我正在做一个条码扫描应用程序,要求是当状态码为 500 时,我们将重试请求,如果 400 则将该条码推送到数组中(以列出错误 400 的条码)。

我需要 运行 .retryWhen 与上述要求的状态代码。 我的代码现在是这样的,但是它总是在出现错误时重试并跳过 .subcribe,我需要处理错误 400,我只需要在状态代码为 500 时重试,然后使用 400 推送该条形码进入数组。

let modelItem = {
   ...
};
this._pickAppSv.updateTicketStatus(modelItem, !endWave)
 .retryWhen((obs) => { // Retry when error status is 500, 10 times
  return obs
   .mergeMap(error => (error.status === 500) ? Observable.throw(error) : Observable.of(error))
   .take(9);
 })
 .subscribe(
  (resp: any) => {
   ...
  },
  (err) => {
   if (err.message === 'Bad Request') { // error 400
    this.errorList.push(modelItem);
   }
  }
 );

找了很多好像都没有解决办法。非常感谢您的帮助。

你可以这样做

this._pickAppSv.updateTicketStatus(modelItem, !endWave).pipe(
            retryWhen(obs => {
                return obs.pipe(
                    mergeMap((response) => {
                        if (response.status === 500) {
                            return of(response).pipe(
                                delay(2000),
                                take(9)
                            );
                        }
                        if (response.status == 404) {
                          //do something
                          throw({error: response});
                        }

                        return throwError({error: "Unknown error for asynchronous function:" + response});
                    }),
                );
            })
        ).subscribe({
          //do something
        });

Shashank的回答是正确的。但是由于某些原因,我的 rxjs 版本无法与 .pipe 一起使用,所以我对其进行了一些更改。谢谢沙山克。

this._pickAppSv.updateTicketStatus(modelItem, !endWave)
      .retryWhen((obs) => { // Retry when error status is 500, 10 times
        return obs
          .mergeMap((error) => {
            if (error.status === 500) {
              return Observable.of(error)
                     .delay(500)
            }
            if (error.status === 400) {
              this.errorList.push(modelItem);
              throw({error: error.message});
            }
            return Observable.throw({error: 'Error:' + error});
          })
          .take(9);
      })
      .subscribe({
        //do something
      });

我使用以下解决方案,如果错误状态不是 401,则重试 3 次(延迟 2 秒)

retryWhen(error => {
    return error.pipe(
        mergeMap(error => {
            if (error.status !== 401) {
                return of(error);
            }
            return throwError(error);
        }),
        scan((acc, error) => {
            if (acc > 2) throw error;
            return acc + 1;
        }, 0),
        tap((c) => console.log(`retrying ${c}`)),
        delay(2000),
    );
}),