2015-12-12 18 views
7

RxJ'ler akışımdaki Gözlemlenebilir'in üzerine belirli bir duruma gelene kadar dönmeye çalışıyorum, daha sonra akış devam etsin. Özellikle senkronize bir do/while döngüsünü RxJ'lere dönüştürüyorum, ama aynı cevabın bir for ya da while loop için de kullanılabileceğini düşünüyorum.RxJs: Gözlemlenebilir duruma göre nasıl döngü yapılır?

Bunun için doWhile() yöntemini kullanabileceğimi düşünmüştüm, ancak işlev işlevi akıştaki öğeye erişemediğinden, amacın beni yenmesi gibi görünüyor.

var source = new Rx.Observable.of({val: 0, counter: 3}); 

source.map(o => { 
    o.counter--; 
    console.log('Counter: ' + o.counter); 

    if (!o.counter) { 
    o.val = "YESS!"; 
    } 
    return o; 
}) 
.doWhile(o => { 
    return o.counter > 0; 
}) 
.subscribe(
    function (x) { 
     console.log('Next: ' + x.val); 
    }, 
    function (err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

beklenen çıkışı olacaktır:: Doğru reaktif terminoloji burada ne istiyorum içindir, ama ne tam olarak emin değilim

Ben gidiyorum ne bir örnektir

Bunun çözülebilir bir sorun olduğunu varsayarak, döngü yaptığınızda dönmek istediğiniz yeri 'başlat' olarak işaretlediğinizden emin değilim.

cevap

7

expand işleci, bir seçici işlevini yinelemeli olarak çağırabilmenizi sağlayarak sizi kapatacak şekilde çalışır. Gözlenebilir bir boşluğun döndürülmesi, bu durumda sizin aramızda olacaktır. jsbin Bkz:

var source = Rx.Observable.return({val: 0, counter: 3}) 
    .expand(value => { 
     if(!value.counter) return Rx.Observable.empty(); 
     value.counter -= 1; 
     if(!value.counter) value.val = 'YESS'; 
     return Rx.Observable.return(value) 
    }) 
    .subscribe(value => console.log(value.counter ? 
            'Counter: ' + value.counter : 
            'Next: ' + value.val)); 
+0

Hum. .. ilginç, ben bu işi yapmak mümkün olabilir, ben .expand(). map() m yapsaydım, bunu kullanarak – JBCP

+0

geri göndereceğiz y aşağı akım haritası işlem değerini birkaç kez sonlandırırdı. Son işlemin sadece son sonucu işlemesini istiyorum. Sanırım expand(). Filter(). Map() çalışabilir. – JBCP

+0

Hm. Akıntıya birden çok değer aktarmayı engellemeye izin veren aklınıza gelen tek diğer konu bir konudur. Kendime temiz bir çözümle ilgileneceğim :). –

5

Eğer expand operatörünü kullanarak ve Rx.Observable.empty (http://jsfiddle.net/naaycu71/3/) ile özyineleme sonunu bildiren yakın istiyorum ama değil tam olarak ne:

var source = new Rx.Observable.of({val: 0, counter: 3}); 

source.expand(function(o) { 
    console.log('Counter: ' + o.counter); 
    o.counter--; 

return (o.counter >= 0) ? Rx.Observable.just(o) : Rx.Observable.empty() 
}) 
.subscribe(
    function (x) { 
     console.log('Next: ' , x); 
    }, 
    function (err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

Çıktı:

Next: Object {val: 0, counter: 3} 
Counter: 3 
Next: Object {val: 0, counter: 2} 
Counter: 2 
Next: Object {val: 0, counter: 1} 
Counter: 1 
Next: Object {val: 0, counter: 0} 
Counter: 0 
Completed