这是另一种方法,但我觉得这种方法更直接,更直观(如果您习惯了Promises,则至少是自然的)。基本上,您创建一个ObservableObservable.create()
用来包装one
和two
作为单个Observable。这与Promise.all()
工作方式非常相似。
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();
}
);
}
);
});
那么,这是怎么回事?首先,我们创建一个新的Observable。传递给函数Observable.create()
,恰如其名onSubscription
,传递观察者(由你传递给参数建subscribe()
),这是类似的resolve
,并reject
创造了新的承诺时,组合成一个单一的对象。这就是我们使魔术发挥作用的方式。
在中onSubscription
,我们订阅了第一个Observable(在上面的示例中,这称为one
)。我们如何处理next
并error
取决于您,但是从总体上来讲,我的示例中提供的默认值应该是适当的。但是,当我们接收到该complete
事件(即one
已经完成)时,我们可以订阅下一个Observable。从而在第一个Observable完成后触发第二个Observable。
为第二个Observable提供的示例观察器非常简单。基本上,second
现在的行为就像您希望two
在OP中表现的那样。更具体地说,假设没有错误,second
将发出由someOtherObservable
(由于take(1)
)发出的第一个值,并且只有第一个值,然后完成。
例
这是一个完整的工作示例,如果您想看到我的示例在现实生活中可以工作,则可以复制/粘贴该示例:
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!");
}
);
如果您观看控制台,将显示以上示例:
1个
6
做完了!