これはさらに別の方法ですが、私はより直接的で直感的な(または、Promisesに慣れている場合は少なくとも自然な)アプローチを感じます。基本的に、Observable.create()
ラップにone
を使用しtwo
て単一のObservableとして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を作成するときに、1つのオブジェクトに類似しresolve
てreject
結合されます。これが私たちが魔法を機能させる方法です。
ではonSubscription
、最初のObservableをサブスクライブします(上記の例では、これはと呼ばれていましたone
)。どのように我々はハンドルnext
とerror
あなた次第ですが、私のサンプルで提供されるデフォルトは、一般的に適切でなければなりません。ただし、complete
イベントを受信すると、つまりこれでone
完了したら、次のObservableをサブスクライブできます。これにより、最初のObservableが完了した後、2番目のObservableを起動します。
2番目の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
完了!