İşte bir tane daha, ama daha açık ve sezgisel hissediyorum (veya en azından Sözlere alışkınsanız doğal), yaklaşın. Temel olarak, Observable.create()
sarmak için kullanarak one
ve two
tek bir Gözlemlenebilir olarak bir Gözlemlenebilir oluşturursunuz. Bu, nasıl Promise.all()
çalışabileceğine çok benzer .
var first = someObservable.take(1);
var second = Observable.create((observer) => {
return first.subscribe(
function onNext(value) {
},
function onError(error) {
observer.error(error);
},
function onComplete() {
someOtherObservable.take(1).subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
observer.complete();
}
);
}
);
});
Peki burada neler oluyor? İlk önce yeni bir Observable oluşturuyoruz. Uygun bir Observable.create()
şekilde adlandırılmış olan işlev onSubscription
, gözlemciye aktarılır (geçtiğiniz parametrelerden oluşturulur subscribe()
), bu da resolve
vereject
yeni bir Promise oluştururken tek bir nesneye tek bir nesnede birleştirilen . Sihri bu şekilde çalıştırıyoruz.
' onSubscription
Da ilk Gözlemlenebilir'e abone oluruz (yukarıdaki örnekte buna denir one
). Nasıl başa çıkacağımız next
ve error
size kalmış, ancak örneğimde sağlanan varsayılan genel olarak uygun olmalıdır. Ancak, complete
etkinliği aldığımızdaone
artık bitti, bir sonraki Gözlemlenebilir'e abone olabiliriz; böylelikle birinci Gözlemlenebilir olanı birincisi tamamlandıktan sonra ateşler.
İkinci Gözlemlenebilir için sağlanan örnek gözlemci oldukça basittir. Temel olarak, second
artık two
OP'de olmasını beklediğiniz gibi davranıyor. Daha spesifik olarak, second
tarafından yayılan ilk ve yalnızca ilk değeri yayar someOtherObservable
(çünkütake(1)
hata olmadığını varsayarak ) ve sonra tamamlayacaktır.
Misal
İşte örneğimin gerçek hayatta çalıştığını görmek istiyorsanız kopyalayıp yapıştırabileceğiniz eksiksiz, çalışan bir örnek:
var someObservable = Observable.from([1, 2, 3, 4, 5]);
var someOtherObservable = Observable.from([6, 7, 8, 9]);
var first = someObservable.take(1);
var second = Observable.create((observer) => {
return first.subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
someOtherObservable.take(1).subscribe(
function onNext(value) {
observer.next(value);
},
function onError(error) {
observer.error(error);
},
function onComplete() {
observer.complete();
}
);
}
);
}).subscribe(
function onNext(value) {
console.log(value);
},
function onError(error) {
console.error(error);
},
function onComplete() {
console.log("Done!");
}
);
Konsolu izlerseniz, yukarıdaki örnek yazdırılacaktır:
1
6
Bitti!