带有条件状态码的角度重试时间

时间:2019-12-17 03:45:24

标签: javascript angular rxjs http-status-codes

我对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);
   }
  }
 );

我进行了很多搜索,但似乎没有解决办法。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您可以这样做

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
        });

答案 1 :(得分:1)

Shashank的答案是正确的。但是由于某种原因,我的rxjs版本无法与.pipe一起使用,因此我做了一些更改。谢谢Shashank。

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
      });

答案 2 :(得分:0)

如果错误状态不是 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),
    );
}),