typescript - Angular 2 ile RxJS 5: Başarısız olan Observable'ı yeniden dene ama sonra hatayı ilet
Bir HTTP isteği başarısız olduğunda, 1 saniye arayla iki kez yeniden denemek istiyorum. Eğer üçüncü seferde tekrar başarısız olursa, bu hatayı Gözlemcilere iletmek istiyorum. Son kısımda sorun yaşıyorum.
HTTP isteği DataService.get() üzerinden
return this.http.get(url,options)
.retryWhen(errors => errors.delay(1000).take(2))
.catch((res)=>this.handleError(res));
Abonelik
this.dataSvc.get('/path').subscribe(
res => console.log(res),
err => console.error(err),
() => console.log('Complete')
);
Sunucum her zaman bir hata (durum 400 Bad request) dönecek şekilde ayarlandı.
Uygulamanın 2. isteği yapmasını, 3. isteği yapmasını ve ardından
this.handleError()ile yakalanacak hatayı atmasını istiyorumGerçekte olan: uygulama 2. bir istek yapar, 3. bir istek yapar, sonra Observable hata olmadan tamamlanır (konsola “Complete” yazdırılır)
Angular 2 rc.6, RxJS 5 beta 11, Typescript 2.0.2
Cevap #1
scan operatörünü kullandım:
return this.http.get(url,options)
.retryWhen(errors => errors.delay(1000).scan((acc,source,index)=>{
if(index) throw source;
}))
.catch((res)=>this.handleError(res));
scan() fonksiyonunun parametreleri:
acc: bir toplayıcı (düşününArray.reduce()). Eğer bunu değiştirir ve geri döndürürseniz, yeni değer bir sonraki çalıştırmadaaccparametresi olarak verilecektirsource: önceki operasyondan (errorsüzerinden iletendelay()dahil) yayılan değer (veya istisna)index: Şu anda yayımlanan değerin sırası (sıfır tabanlı)
Bu 3 HTTP isteği yapıyor (Nedenini bilmiyorum; 2 olmasını beklerdim). 3. başarısızlıkta, yakalanmak üzere handleError() tarafından yakalanan hatayı vermek için source fırlatıyor
