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

问题描述 投票:0回答:3

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

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

javascript angular rxjs http-status-codes
3个回答
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
投票

沙申克的答案是正确的。但是由于某种原因,我的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
      });


0
投票

大约400响应变成错误。因此,您必须操纵结果。

    this._pickAppSv.updateTicketStatus(modelItem, !endWave).
pipe(
    map(res => {
        if( res.status === 500){
            throw res;
        }
        return res;
    }),
    retryWhen(res => {
        res.pipe(take(10))
    })
).subscribe( data => {
    if (err.message === 'Bad Request') { // error 400
        this.errorList.push(modelItem);
    }
})
© www.soinside.com 2019 - 2024. All rights reserved.