Skip to content
This repository was archived by the owner on Apr 20, 2018. It is now read-only.

Commit 530e842

Browse files
Merge pull request #618 from GDoronin/master
What about having a getter for BehaviorSubject value?
2 parents b378c8e + 2bbad15 commit 530e842

2 files changed

Lines changed: 78 additions & 0 deletions

File tree

src/core/subjects/behaviorsubject.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@
3434
}
3535

3636
addProperties(BehaviorSubject.prototype, Observer, {
37+
/**
38+
* Gets the current value or throws an exception.
39+
* Value is frozen after onCompleted is called.
40+
* After onError is called Value always throws the specified exception.
41+
* An exception is always thrown after dispose is called.
42+
* @returns {Mixed} The initial value passed to the constructor until OnNext is called; after which, the last value passed to OnNext.
43+
*/
44+
getValue: function () {
45+
checkDisposed(this);
46+
if (this.hasError) {
47+
throw this.error;
48+
}
49+
return this.value;
50+
},
3751
/**
3852
* Indicates whether the subject has observers subscribed to it.
3953
* @returns {Boolean} Indicates whether the subject has observers subscribed to it.

tests/subjects/behaviorsubject.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,3 +287,67 @@ test('SubjectDisposed', function () {
287287
onNext(550, 5)
288288
);
289289
});
290+
291+
test('value vs getValue()', function () {
292+
var scheduler = new TestScheduler();
293+
294+
var subject;
295+
296+
var resultsGetValue = scheduler.createObserver();
297+
var resultsValue = scheduler.createObserver();
298+
299+
// create and dispose
300+
scheduler.scheduleAbsolute(100, function () { subject = new BehaviorSubject(0); });
301+
scheduler.scheduleAbsolute(650, function () { subject.dispose(); });
302+
303+
// fill the subject with values
304+
scheduler.scheduleAbsolute(150, function () { subject.onNext(1); });
305+
scheduler.scheduleAbsolute(250, function () { subject.onNext(2); });
306+
scheduler.scheduleAbsolute(350, function () { subject.onNext(3); });
307+
scheduler.scheduleAbsolute(450, function () { subject.onNext(4); });
308+
scheduler.scheduleAbsolute(550, function () { subject.onError(new Error('Subject onError() method has been called')); });
309+
310+
// getValue()
311+
scheduler.scheduleAbsolute(200, function () { resultsGetValue.onNext(subject.getValue()); });
312+
scheduler.scheduleAbsolute(300, function () { resultsGetValue.onNext(subject.getValue()); });
313+
scheduler.scheduleAbsolute(400, function () { resultsGetValue.onNext(subject.getValue()); });
314+
scheduler.scheduleAbsolute(500, function () { resultsGetValue.onNext(subject.getValue()); });
315+
scheduler.scheduleAbsolute(600, function () { raises(function () { resultsGetValue.onNext(subject.getValue()); }); });
316+
scheduler.scheduleAbsolute(700, function () { raises(function () { resultsGetValue.onNext(subject.getValue()); }); });
317+
318+
// value
319+
scheduler.scheduleAbsolute(200, function () { resultsValue.onNext(subject.value); });
320+
scheduler.scheduleAbsolute(300, function () { resultsValue.onNext(subject.value); });
321+
scheduler.scheduleAbsolute(400, function () { resultsValue.onNext(subject.value); });
322+
scheduler.scheduleAbsolute(500, function () { resultsValue.onNext(subject.value); });
323+
scheduler.scheduleAbsolute(600, function () { resultsValue.onNext(subject.value); });
324+
scheduler.scheduleAbsolute(700, function () { resultsValue.onNext(subject.value); });
325+
326+
scheduler.start();
327+
328+
resultsGetValue.messages.assertEqual(
329+
onNext(200, 1),
330+
onNext(300, 2),
331+
onNext(400, 3),
332+
onNext(500, 4)
333+
334+
// getValue() throws an exception if BehaviorSubject.onError() has been called
335+
//onNext(600)
336+
337+
// getValue() throws an exception if BehaviorSubject has been disposed
338+
//onNext(700)
339+
);
340+
341+
resultsValue.messages.assertEqual(
342+
onNext(200, 1),
343+
onNext(300, 2),
344+
onNext(400, 3),
345+
onNext(500, 4),
346+
347+
// value is frozen if BehaviorSubject.onError() has been called
348+
onNext(600, 4),
349+
350+
// value returns null if BehaviorSubject has been disposed
351+
onNext(700, null)
352+
);
353+
});

0 commit comments

Comments
 (0)