这里有另一种方法,我觉得更加直接和直观(或者至少对于习惯Promise的人来说更自然)。基本上,你可以使用Observable.create()
创建一个Observable,将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()
的观察者对象(类似于创建新Promise时传递给resolve
和reject
的参数合并到一个对象中)。这就是我们的魔法所在。
在onSubscription
中,我们订阅了第一个Observable(在上面的示例中,它被称为one
)。我们如何处理next
和error
由你决定,但默认提供的示例对大多数情况来说应该是适当的。然而,当我们接收到complete
事件时,也就是说one
现在已经完成,我们可以订阅下一个Observable;这样,在第一个Observable完成后,第二个Observable就会被触发。
针对第二个Observable提供的示例观察者非常简单。基本上,second
现在的行为就像OP中预期的two
一样。更具体地说,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
完成!