You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.7 KiB
124 lines
4.7 KiB
"use strict"; |
|
var __extends = (this && this.__extends) || function (d, b) { |
|
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; |
|
function __() { this.constructor = d; } |
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); |
|
}; |
|
var Subscription_1 = require('../Subscription'); |
|
var tryCatch_1 = require('../util/tryCatch'); |
|
var errorObject_1 = require('../util/errorObject'); |
|
var OuterSubscriber_1 = require('../OuterSubscriber'); |
|
var subscribeToResult_1 = require('../util/subscribeToResult'); |
|
/** |
|
* Buffers the source Observable values, using a factory function of closing |
|
* Observables to determine when to close, emit, and reset the buffer. |
|
* |
|
* <span class="informal">Collects values from the past as an array. When it |
|
* starts collecting values, it calls a function that returns an Observable that |
|
* tells when to close the buffer and restart collecting.</span> |
|
* |
|
* <img src="./img/bufferWhen.png" width="100%"> |
|
* |
|
* Opens a buffer immediately, then closes the buffer when the observable |
|
* returned by calling `closingSelector` function emits a value. When it closes |
|
* the buffer, it immediately opens a new buffer and repeats the process. |
|
* |
|
* @example <caption>Emit an array of the last clicks every [1-5] random seconds</caption> |
|
* var clicks = Rx.Observable.fromEvent(document, 'click'); |
|
* var buffered = clicks.bufferWhen(() => |
|
* Rx.Observable.interval(1000 + Math.random() * 4000) |
|
* ); |
|
* buffered.subscribe(x => console.log(x)); |
|
* |
|
* @see {@link buffer} |
|
* @see {@link bufferCount} |
|
* @see {@link bufferTime} |
|
* @see {@link bufferToggle} |
|
* @see {@link windowWhen} |
|
* |
|
* @param {function(): Observable} closingSelector A function that takes no |
|
* arguments and returns an Observable that signals buffer closure. |
|
* @return {Observable<T[]>} An observable of arrays of buffered values. |
|
* @method bufferWhen |
|
* @owner Observable |
|
*/ |
|
function bufferWhen(closingSelector) { |
|
return function (source) { |
|
return source.lift(new BufferWhenOperator(closingSelector)); |
|
}; |
|
} |
|
exports.bufferWhen = bufferWhen; |
|
var BufferWhenOperator = (function () { |
|
function BufferWhenOperator(closingSelector) { |
|
this.closingSelector = closingSelector; |
|
} |
|
BufferWhenOperator.prototype.call = function (subscriber, source) { |
|
return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); |
|
}; |
|
return BufferWhenOperator; |
|
}()); |
|
/** |
|
* We need this JSDoc comment for affecting ESDoc. |
|
* @ignore |
|
* @extends {Ignored} |
|
*/ |
|
var BufferWhenSubscriber = (function (_super) { |
|
__extends(BufferWhenSubscriber, _super); |
|
function BufferWhenSubscriber(destination, closingSelector) { |
|
_super.call(this, destination); |
|
this.closingSelector = closingSelector; |
|
this.subscribing = false; |
|
this.openBuffer(); |
|
} |
|
BufferWhenSubscriber.prototype._next = function (value) { |
|
this.buffer.push(value); |
|
}; |
|
BufferWhenSubscriber.prototype._complete = function () { |
|
var buffer = this.buffer; |
|
if (buffer) { |
|
this.destination.next(buffer); |
|
} |
|
_super.prototype._complete.call(this); |
|
}; |
|
/** @deprecated internal use only */ BufferWhenSubscriber.prototype._unsubscribe = function () { |
|
this.buffer = null; |
|
this.subscribing = false; |
|
}; |
|
BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { |
|
this.openBuffer(); |
|
}; |
|
BufferWhenSubscriber.prototype.notifyComplete = function () { |
|
if (this.subscribing) { |
|
this.complete(); |
|
} |
|
else { |
|
this.openBuffer(); |
|
} |
|
}; |
|
BufferWhenSubscriber.prototype.openBuffer = function () { |
|
var closingSubscription = this.closingSubscription; |
|
if (closingSubscription) { |
|
this.remove(closingSubscription); |
|
closingSubscription.unsubscribe(); |
|
} |
|
var buffer = this.buffer; |
|
if (this.buffer) { |
|
this.destination.next(buffer); |
|
} |
|
this.buffer = []; |
|
var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)(); |
|
if (closingNotifier === errorObject_1.errorObject) { |
|
this.error(errorObject_1.errorObject.e); |
|
} |
|
else { |
|
closingSubscription = new Subscription_1.Subscription(); |
|
this.closingSubscription = closingSubscription; |
|
this.add(closingSubscription); |
|
this.subscribing = true; |
|
closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier)); |
|
this.subscribing = false; |
|
} |
|
}; |
|
return BufferWhenSubscriber; |
|
}(OuterSubscriber_1.OuterSubscriber)); |
|
//# sourceMappingURL=bufferWhen.js.map
|