古いRxJの場合、私はあなたが望むもののほとんどを行うconcatLatest
演算子を書いていました。このコードを使用すると、このコードで調整動作を得ることができます。
const delay = Rx.Observable.empty().delay(500);
inputObservable
.map(value => Rx.Observable.of(value).concat(delay))
.concatLatest()
.subscribe(...);
ここに演算子があります。
Rx.Observable.prototype.concatLatest = function() {
/// <summary>
/// Concatenates an observable sequence of observable sequences, skipping sequences that arrive while the current sequence is being observed.
/// If N new observables arrive while the current observable is being observed, the first N-1 new observables will be thrown
/// away and only the Nth will be observed.
/// </summary>
/// <returns type="Rx.Observable"></returns>
var source = this;
return Rx.Observable.create(function (observer) {
var latest,
isStopped,
isBusy,
outerSubscription,
innerSubscription,
subscriptions = new Rx.Subscription(function() {
if (outerSubscription) {
outerSubscription.unsubscribe();
}
if (innerSubscription) {
innerSubscription.unsubscribe();
}
}),
onError = observer.error.bind(observer),
onNext = observer.next.bind(observer),
innerOnComplete = function() {
var inner = latest;
if (inner) {
latest = undefined;
if (innerSubscription) {
innerSubscription.unsubscribe();
}
innerSubscription = inner.subscribe(onNext, onError, innerOnComplete);
}
else {
isBusy = false;
if (isStopped) {
observer.complete();
}
}
};
outerSubscription = source.subscribe(function (newInner) {
if (isBusy) {
latest = newInner;
}
else {
isBusy = true;
if (innerSubscription) {
innerSubscription.unsubscribe();
}
innerSubscription = newInner.subscribe(onNext, onError, innerOnComplete);
}
}, onError, function() {
isStopped = true;
if (!isBusy) {
observer.complete();
}
});
return subscriptions;
});
};
そして、ここで更新plunkrです:私はRxJS5で動作するようにそれを更新で刺しを取った私は、最新バージョンにlodashのバージョンを更新https://plnkr.co/edit/DSVmSPRijJwj9msefjRi?p=preview
注意。 lodash 4.7では、いくつかのエッジケースのバグを修正するためにスロットル/デバウンス演算子を書き直しました。 4.6.1を使用していましたが、テストに影響しているとは思われませんでしたが、これらのバグのいくつかが残っていました。
こんにちは@Brandon、偉大な答え。 RxJS 4.xを使用してconcatLatest演算子でplunkrへのリンクを提供できますか? (質問はRxJS 5に固有のものなので、私は聞いたことはありませんでしたが、あなたはすでに便利だと言っていました:) – HipsterZipster
@HipsterZipster RxJS 2用にこのバージョンを書いたのですが、それも4で動作します:https:// gist.github.com/bman654/92749cd93cdd84a540e41403f25a2105 – Brandon