From eae4b0009268e6571c6929dad32118d7f62d6350 Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Tue, 8 Dec 2015 13:04:30 -0800 Subject: [PATCH] fix(every): handle thisArg for scalar and array observables - adds some tests around this as well. related #889 --- spec/operators/every-spec.js | 38 ++++++++++++++++++++++++++++++++++++ src/operator/every.ts | 13 +++++------- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/spec/operators/every-spec.js b/spec/operators/every-spec.js index 9843618bd9..2c85cfed42 100644 --- a/spec/operators/every-spec.js +++ b/spec/operators/every-spec.js @@ -11,6 +11,44 @@ describe('Observable.prototype.every()', function () { return x % 5 === 0; } + it('should accept thisArg with scalar observables', function () { + var thisArg = {}; + var result; + + Observable.of(1).every(function () { + result = this; + }, thisArg).subscribe(); + + expect(result).toBe(thisArg); + }); + + + it('should accept thisArg with array observables', function () { + var thisArg = {}; + var result; + + Observable.of(1,2,3,4).every(function () { + result = this; + }, thisArg).subscribe(); + + expect(result).toBe(thisArg); + }); + + it('should accept thisArg with ordinary observables', function () { + var thisArg = {}; + var result; + + Observable.create(function (observer) { + observer.next(1); + observer.complete(); + }) + .every(function () { + result = this; + }, thisArg).subscribe(); + + expect(result).toBe(thisArg); + }); + it('should emit true if source is empty', function () { var source = hot('-----|'); var sourceSubs = '^ !'; diff --git a/src/operator/every.ts b/src/operator/every.ts index a77d81d82c..0d73f0a4a8 100644 --- a/src/operator/every.ts +++ b/src/operator/every.ts @@ -14,7 +14,7 @@ export function every(predicate: (value: T, index: number, source: Observable let result; if (source._isScalar) { - result = tryCatch(predicate)(source.value, 0, source); + result = tryCatch(predicate).call(thisArg || this, source.value, 0, source); if (result === errorObject) { return new ErrorObservable(errorObject.e, source.scheduler); } else { @@ -24,7 +24,7 @@ export function every(predicate: (value: T, index: number, source: Observable if (source instanceof ArrayObservable) { const array = (>source).array; - let result = tryCatch((array, predicate) => array.every(predicate))(array, predicate); + let result = tryCatch((array, predicate, thisArg) => array.every(predicate, thisArg))(array, predicate, thisArg); if (result === errorObject) { return new ErrorObservable(errorObject.e, source.scheduler); } else { @@ -49,8 +49,8 @@ class EverySubscriber extends Subscriber { private index: number = 0; constructor(destination: Observer, - private predicate?: (value: T, index: number, source: Observable) => boolean, - private thisArg?: any, + private predicate: (value: T, index: number, source: Observable) => boolean, + private thisArg: any, private source?: Observable) { super(destination); } @@ -61,10 +61,7 @@ class EverySubscriber extends Subscriber { } _next(value: T): void { - const { predicate, thisArg, source } = this; - const tryCaught = tryCatch(predicate); - const index = this.index++; - let result = thisArg ? tryCaught.call(thisArg, value, index, source) : tryCaught(value, index, source); + const result = tryCatch(this.predicate).call(this.thisArg || this, value, this.index++, this.source); if (result === errorObject) { this.destination.error(result.e);