angular - تلاش مجدد درخواست HTTP فقط برای کدهای وضعیت خاص
در برنامه Angular خود، میخواهم یک تماس HTTP به سرور پشتیبان برقرار کنم. برای اینکه آن مقاومتر شود، یک اینترسپتور اضافه کردم تا الگوی تلاش مجدد را پیادهسازی کنم.
قبلاً از عملگر retryWhen در RxJS استفاده میکردم، اما حالا این منسوخ شده است، بنابراین من این کار را انجام میدهم:
return next.handle(copiedRequest).pipe(
retry({
count: 5,
delay: 1000,
}),
catchError((error: HttpErrorResponse) => {
if (error.status === 0) {
// Server not responding, so stuff
}
return throwError(() => error);
})
);
مشکل این است که حالا این برای همه وضعیتهای پاسخ HTTP من کار میکند، در حالی که گاهی وقتی سرور یک کد وضعیت خاص بازمیگرداند، میدانید که تلاش مجدد بیمعنی است. آیا راهی وجود دارد که یک فیلتر به تلاش مجدد اضافه کرد تا بررسی کند که آیا واقعاً باید تلاش مجدد انجام شود یا خیر؟
پاسخ شماره ۱
آنچه شما میخواهید میتواند با پارامتر delay از عملگر retry به دست آید:
next
.handle(copiedRequest)
.pipe(
retry({
count: 5,
delay: (error: HttpErrorResponse, retryCount: number) => {
// not using it for the demo you could also dynamically
// change the behavior based on the retryCount param
switch (error.status) {
// retryable error status
case 0:
case 1:
// retry
return of(null);
default:
// for the rest, we just forward the original error
return throwError(() => error);
}
},
})
)
در اینجا یک دمو از Stackblitz وجود دارد که میتوانید با آن بازی کنید و جایی که من همچنین چند نمونه شبیهسازی ساختهام تا بتوانید صحت اینکه درخواست اصلی چندین بار دوباره ارسال میشود را بررسی کنید.
خروجی کنسول را در Stackblitz مشاهده کنید:
Request made: 0 // first one
Request made: 1 // second one
Request made: 2 // third one
An error was caught: Error: Some mocked error // received a non retryable error and forwarded it
پاسخ شماره ۲
مشابه اینکه ما در اکوسیستم داتنت برای مکانیزم تلاش مجدد از Polly استفاده میکنیم، یک بسته مفید به نام cockatiel وجود دارد. با استفاده از این بسته، میتوانیم تلاش مجدد را بر اساس نوع استثنا تنظیم کنیم.
