Sonunda Abone Olduğunda Gözlemlenebilir


106

Göre bu artcle , onCompleteve onErrorfonksiyonu subscribebirbirini dışlar.

Yani ya onErrorda onCompleteolaylar bende patlayacak subscribe.
Bir hata alsam veya bilgi birikimimi başarıyla bitirdiğimde yürütülmesi gereken bir mantık bloğum var.

finallyPython'daki gibi bir şey aradım , ancak bulduğum tek şey finally, yarattığım gözlemlenebilir olana bağlanması gerektiğiydi.

Ancak bu mantığı yalnızca abone olduğumda ve akış bittikten sonra, başarılı bir şekilde veya bir hata ile yapmak istiyorum.

Herhangi bir fikir?

Yanıtlar:


135

Bu operatörün mevcut "borulabilir" varyantı denir finalize()(RxJS 6'dan beri). Daha eski ve artık kullanılmayan "yama" operatörü çağrıldı finally()(RxJS 5.5'e kadar).

finalize()Operatörün aslında doğru olduğunu düşünüyorum . Diyorsun:

bu mantığı yalnızca abone olduğumda ve yayın bittikten sonra yap

bence bu bir sorun değil. İsterseniz abone olmadan önce bir single alabilir sourceve kullanabilirsiniz finalize(). Bu şekilde her zaman kullanmanız gerekmez finalize():

let source = new Observable(observer => {
  observer.next(1);
  observer.error('error message');
  observer.next(3);
  observer.complete();
}).pipe(
  publish(),
);

source.pipe(
  finalize(() => console.log('Finally callback')),
).subscribe(
  value => console.log('#1 Next:', value),
  error => console.log('#1 Error:', error),
  () => console.log('#1 Complete')
);

source.subscribe(
  value => console.log('#2 Next:', value),
  error => console.log('#2 Error:', error),
  () => console.log('#2 Complete')
);

source.connect();

Bu, konsola yazdırır:

#1 Next: 1
#2 Next: 1
#1 Error: error message
Finally callback
#2 Error: error message

Oca 2019: RxJS 6 için güncellendi


1
finally()Metodun önce eklenmesi ve aboneliğin zorunlu olarak başarılı / başarısız olması nedeniyle Promises'in zıt modeli olması ilginçtir .
BradGreens

7
Evet, bu çok kötü. Biri finallybloğun kodunuzda en son geleceğini düşünür .
d512

Angular JS'nin vaat sistemini beğendim ... d512'nin dediği gibi "nihayet" in son olmasını bekliyordum ... Bunu hiç beğenmedim ...
Sampgun

10
RXJS 5.5'ten itibaren, "nihayet" artık bir Gözlemlenebilir yöntem değildir. Bunun yerine "finalize" operatörünü kullanın: source.pipe (finalize (() => console.log ('Son olarak geri arama'))). Subscribe (...); github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md
Stevethemacguy

finalize ile ilgili problem bir "complete ()" çağrısı beklemesidir. ya her emisyonda bir nihayet istiyorsanız (eğer gözlemlenebilir emisyon başarı ise a yapın , hata varsa, b yerine b yapın .. her iki durumda da c yapın )?
roberto tomás

68

Benim için çalışan tek şey bu

fetchData()
  .subscribe(
    (data) => {
       //Called when success
     },
    (error) => {
       //Called when error
    }
  ).add(() => {
       //Called when operation is complete (both success and error)
  });

26

Şimdi bir Angular uygulamasında RxJS 5.5.7 kullanıyorum ve finalizeoperatörün kullanılması, başarı veya hata geri aramalarından önce çalıştırıldığından kullanım durumum için garip bir davranışa sahip.

Basit örnek:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000),
    finalize(() => {
      // Do some work after complete...
      console.log('Finalize method executed before "Data available" (or error thrown)');
    })
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );

İstediğimi addbaşarmak için abonelikteki medhod'u kullanmak zorunda kaldım . Temel olarak finallybaşarı veya hata geri aramaları yapıldıktan sonra yapılan geri arama. Bir try..catch..finallyblok veya Promise.finallyyöntem gibi.

Basit örnek:

// Simulate an AJAX callback...
of(null)
  .pipe(
    delay(2000)
  )
  .subscribe(
      response => {
        console.log('Data available.');
      },
      err => {
        console.error(err);
      }
  );
  .add(() => {
    // Do some work after complete...
    console.log('At this point the success or error callbacks has been completed.');
  });

Yardımcı olmaktan memnunum
pcasme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.