javascript - rxjs'te hatalardan nasıl kurtulunur?


Gözlemlenebilir dizileri nasıl tüketeceğimi ve hatalardan nasıl kurtulacağımı anlamaya çalışıyorum.

Benim örneğim biraz uyduruk ama gerçek uygulamam burada göstermek için biraz fazla karmaşık. Her neyse, kullanıcı arayüzünde tıkladığında değerler veren someObservable öğem var. Bu, API'ye bir istek yapılmasını (GET/POST/vb.) tetiklemeli. Sorun şu ki, eğer API bir hata dönerse, bundan sonra postData çağrılmıyor.

Sorunu gösteren bir örnek burada yaptım. İşlerin çalışmaya devam etmesi için Rx.Observable.throw yerine Rx.Observable.of kullanabileceğimi fark ettim. Ama bu, subscribe fonksiyonuna bir değer gönderecek. Ve gerçek uygulamamda postData, uygulamanın birden fazla kısmı tarafından yeniden kullanılan bir servis ve orada throw yerine of kullanmak isteyip istemediğimden emin değilim.

Yani benim sorum şu: Bu gibi şeyleri genellikle nasıl ele alıyorsunuz?

let someObservable = Rx.Observable.timer(1, 1000);

someObservable
.switchMap(data =>  {
  return postData(data);
})
.catch(error => {
  console.log("POST failed");
})
.subscribe(val => console.log("Success: " + val));

function postData(data) {
  console.log("Will post " + data);

  if (data !== 2) {
    return Rx.Observable.of(true);
  }
  else {
    return Rx.Observable.throw(new Error("400 Bad Request or something"));
  }
}

http://jsbin.com/naroyeyive/3/edit?js,console

Cevap #1

Eğer isteği tekrar göndermek istiyorsanız, catch yerine retry ve retryWhen araştırmak isteyebilirsiniz.

catch, döndürülen Observable'ı yeni "kaynak" olarak kullanacaktır. Bir örnek için bu bina bakın.

retry(When), operatörlere ilettiğiniz yapılandırmaya bağlı olarak bir hata oluştuğunda "yeniden abone olur". Örnekleri ve daha fazla bilgiyi şuradan bulabilirsiniz: https://www.learnrxjs.io/operators/error_handling/retrywhen.html

İlgili makaleler