2017-01-06 18 views
8

Gözden geçirilebilir bir "yürütücü" işlevinden (isteğe bağlı olarak) döndürülmüş olan "atma" veya "abonelikten çıkma" işlevinin amacının ne olduğu konusunda kafam karıştı, gibi pek:"Aboneliği iptal et" fonksiyonu geri arama/kanca Gözlemlenebilir "yürütücü" işlevi

const Rx = require('rxjs'); 

const obs = Rx.Observable.create(obs => { 

    // we are in the Observable "executor" function 
    obs.next(4); 

    // we return this function, which gets called if we unsubscribe 
    return function() { 
     console.log('disposed'); 
    } 

}); 

    const s1 = obs.subscribe(
     function (v) { 
      console.log(v); 
     }, 
     function (e) { 
      console.log(e); 
     }, 
     function() { 
      console.log('complete'); 
     } 
    ); 

    const s2 = obs.subscribe(
     function (v) { 
      console.log(v); 
     }, 
     function (e) { 
      console.log(e); 
     }, 
     function() { 
      console.log('complete'); 
     } 
    ); 


    s1.unsubscribe(); 
    s2.unsubscribe(); 

beni kafasını karıştıran böyle bir işlev aslında kodunuzdaki referanslara tutunmaya ve bu nedenle çöp toplama önlemek için daha muhtemel olacağıdır.

Bu senaryoda bir işlevi döndürmenin amacının ne olduğunu, işlevin çağrıldığını ve imzanın ne olduğunu söyleyebilir misiniz? Bu konuda bilgi bulmakta zorlanıyorum.

let index = 0; 

    let obsEnqueue = this.obsEnqueue = new Rx.Subject(); 

    this.queueStream = Rx.Observable.create(obs => { 

     const push = Rx.Subscriber.create(v => { 
      if ((index % obsEnqueue.observers.length) === obsEnqueue.observers.indexOf(push)) { 
       obs.next(v); 
      } 
     }); 

     return obsEnqueue.subscribe(push); 
    }); 

Bu yerine sadece düz bir fonksiyonun bir abonelik dönmek görünüyor:

Ben de örneğin infaz işlevinden bu bir abonelik döndürmek çok daha karmaşık örneklere bakın. Bununla ne olduğunu açıklayan var mı?

net bir soru yapmak için

, bunu arasındaki fark nedir:

const sub = new Rx.Subject(); 

const obs = Rx.Observable.create($obs => { 

    $obs.next(4); 
    return sub.subscribe($obs); 

}); 

ve sonucu vermeyen çağrı abone: için

const sub = new Rx.Subject(); 

const obs = Rx.Observable.create($obs => { 

    $obs.next(4); 
    sub.subscribe($obs); 

}); 
+0

Aslında "executor" işlevi denir emin değilim, ama bu Promises dünya – Olegzandr

cevap

4

unsubscribe işlevi olduğunu Rx.Observable.create ihtiyaçlarını Alt akış artık akışı dinlemediğinde, etkili bir şekilde kaynakların temizlenmesi için zaman ayırdığınız zaman, geri dönüş başlatılır.

Sorunuzla ilgili olarak; .subscribe(), .unsubscribe() numaralı telefonu arayabileceğiniz aboneliği döndürür. Eğer mansap bu abonelik yoluyla size boru can bir diğer abonelik ile bir şeyler yapmak istiyorsanız: Eğer gözlemlenebilir dinleme dururdu abonelikten fonksiyonu olmadan

const obs = Rx.Observable.create($obs => { 
 
     const timer = Rx.Observable.interval(300) 
 
     .do(i => console.log('emission: ' + i)) 
 

 
     return timer.subscribe($obs); 
 
    }); 
 
    obs.take(4).subscribe(i => console.log('outer-emission:'+i))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.2/Rx.js"></script>

ancak aralık dahili olarak oluşturulan

const obs = Rx.Observable.create($obs => { 
 
    const timer = Rx.Observable.interval(300) 
 
    .do(i => console.log('emission: ' + i)) 
 
    .take(10) 
 
    .subscribe(
 
     val => $obs.next(val), 
 
     err => $obs.error(err), 
 
    () => $obs.complete() 
 
    ); 
 

 
    return function(){} // empty unsubscribe function, internal subscription will keep on running 
 
}); 
 
obs.take(4).subscribe(i => console.log('outer-emission:'+i))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.2/Rx.js"></script>

: geçmeden bunu istiyorum
+0

Hi Mark, analogun adı, teşekkürler! İlk kod bloğunuzda, zamanlayıcıya dönmüyorsam, ancak her şeyi aynı bırakırsam, işler beklendiği gibi çalışır (timer.do'yu iade etmem ya da timer.do'yu aramama fark etmez) Açıklama% 100 doğru mu? Görünüşe bakılırsa timer.do çağrısı geri dönüyor (ilk örnekte)? İkinci örneğe baktığımızda, 4 çekimden sonra bile emisyonun günlüğe ulaştığını görüyorum. – Olegzandr

+0

Ama ilk örnekte Timer geri dönme. İşler hala işe yaramaz! Anlamadım – Olegzandr

+1

Merhaba Olegzandr, ilk örnekte operatörleri zincirledim, bu yüzden zamanlayıcıyı iade etmiyor ama zamanlayıcıda subscribe() var. Bunu daha açık hale getirmek için örneği güncelledim.Kayıt vermeden, ikinci örnekle aynıdır. –

İlgili konular