Für ältere RxJs schrieb ich einen concatLatest
Operator, der das meiste von dem macht, was Sie wollen. Mit diesem Code können Sie Ihr Drosselungsverhalten mit diesem Code erhalten:
const delay = Rx.Observable.empty().delay(500);
inputObservable
.map(value => Rx.Observable.of(value).concat(delay))
.concatLatest()
.subscribe(...);
Hier ist der Operator. Ich nahm einen Stich es die Aktualisierung mit RxJS5 zu arbeiten:
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;
});
};
Und hier ist ein aktualisierter plunkr: https://plnkr.co/edit/DSVmSPRijJwj9msefjRi?p=preview
Hinweis I Ihre lodash Version auf die neueste Version aktualisiert. In lodash 4.7 habe ich die Gas-/Debounce-Operatoren neu geschrieben, um einige Edge-Case-Bugs zu beheben. Sie haben 4.6.1 verwendet, das noch einige dieser Fehler enthielt, obwohl ich glaube, dass sie Ihren Test nicht beeinflusst haben.
Hallo @Brandon, große Antwort. Können Sie einen Link zu plunkr mit dem concatLatest-Operator mit RxJS 4.x bereitstellen? (Ich hätte nicht gefragt, da die Frage für RxJS 5 spezifisch ist, aber Sie sagten, dass Sie es bereits handlich hatten) – HipsterZipster
@HipsterZipster Ich schrieb diese Version für RxJS 2. Ich nehme an, dass es in 4 auch arbeitet: https: // gist.github.com/bman654/92749cd93cdd84a540e41403f25a2105 – Brandon