Oved D Oved D - 3 months ago 15
Javascript Question

rxjs observable doesn't complete when an error occurs

When I create an observable from scratch, and have the observer error, then complete, the done part of the subscription never is invoked.

var observer = Rx.Observable.create(function(observer){
observer.onError(new Error('no!'));
observer.onCompleted();
})

observer.subscribe(
function(x) { console.log('succeeded with ' + x ) },
function(x) { console.log('errored with ' + x ) },
function() { console.log('completed') }
)


The output is:

errored with Error: no!


I'd expect it to be:

errored with Error: no!
completed


If I change the code to invoke onNext instead of onError, the observable properly completes:

var observer = Rx.Observable.create(function(observer){
observer.onNext('Hi!');
observer.onCompleted();
})

observer.subscribe(
function(x) { console.log('succeeded with ' + x ) },
function(x) { console.log('errored with ' + x ) },
function() { console.log('completed') }
)


I get the expected output:

succeeded with Hi!
completed


Why does it not complete when an error has occured?

Answer

That's because an error means completion, so the callback associated to onCompleted never gets called. You can review here Rxjs contract for observables : http://reactivex.io/documentation/contract.html. Quoted from there: An Observable may make zero or more OnNext notifications, each representing a single emitted item, and it may then follow those emission notifications by either an OnCompleted or an OnError notification, but not both. Upon issuing an OnCompleted or OnError notification, it may not thereafter issue any further notifications.

For error management, you can have a look at : https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/errors.md