这是另一种方法,但我觉得这种方法更直接,更直观(如果您习惯了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
做完了!