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ı istiyorum

  • Gerç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ün Array.reduce()). Eğer bunu değiştirir ve geri döndürürseniz, yeni değer bir sonraki çalıştırmada acc parametresi olarak verilecektir
  • source: önceki operasyondan (errors üzerinden ileten delay() 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