这是另一个,但我觉得更直接和直观(或者如果你习惯了 Promises,至少是自然的),方法。基本上,您使用 Observable.create() 创建一个 Observable,将 one 和 two 包装为单个 Observable。这与Promise.all() 的工作方式非常相似。
var first = someObservable.take(1);
var second = Observable.create((observer) => {
return first.subscribe(
function onNext(value) {
/* do something with value like: */
// 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();
}
);
}
);
});
那么,这里发生了什么?首先,我们创建一个新的 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) {
/* do something with value like: */
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
完成!