ppoliani
ppoliani

Reputation: 4906

RxJS error handling

I've got an issue with RxJS swallowing errors. So in my case I've got something like this:

function funcThatThrowsError(fn, ..args) {
     return fn.bind(fn, ...args);
}

function fetchItems() {
     Observable.fromPromise(
        reqwest({
            url: `${API_ROOT}${url}`,
            method,
            data,
            contentType: "application/json"
        })
    ).map(funcThatThrowsError(null, "someValue"))
}

const observableA = fechItems();
const observableB = ... ;

Observable
    .combineLatest(
        observableA,
        observableB,
        () =>  { }
    )
    .forEach(
        () => { }, // success
        (err) -> console.log(err.stack);
    )

So basically I'm deliberately passing a null value as the fn parameter which causes the funcThatThrowsError to throw an exception.

The problem is that the error callback is not invoked in this case. Rather RxJS will use it's own thrower function

function thrower(e) {
   throw e;
}

What's the best practise to deal with this scenario. I feel that there is something that I'm missing.

Upvotes: 1

Views: 2587

Answers (1)

paulpdaniels
paulpdaniels

Reputation: 18663

The exception is happening outside of the Observable. You are raising it while creating a function that you want to pass into the observable.

If you want the error handler at the end of the chain to handle it, you have to raise it inside of the operator chain:

function fetchItems() {
     Observable.fromPromise(
        request({
            url: `${API_ROOT}${url}`,
            method,
            data,
            contentType: "application/json"
        })
    ).map(funcThatThrowsError(content => throw new Error(content), "someValue"))
}

Upvotes: 2

Related Questions