rxjs switchMap поведение при ошибке

У меня путаница по поводу switchMap в rxjs Observable:

например, у меня есть следующий код:

Observable.fromEvent(button, 'click') .switchMap(() => Observable.fromPromise(fetch('http://return-error.com'))) .subscribe( (response) => { console.log(response); }, (error) => { console.log(error); } ); Если я получаю сообщение об ошибке, подписка прерывается. Так есть ли способ справиться с этим, чтобы не создавать новую подписку при любой ошибке?

Я даже пытался отловить ошибку и вернуть Observable, но подписка все равно прервана.

upd: как справиться с angular 2 http.get вместо fetch?


person Mikhail Linkov    schedule 14.04.2017    source источник


Ответы (1)


Когда вы задаете эти вопросы, всегда будет полезнее сделать корзину. Я сделал это для вас на этом.

Вам просто нужно проглотить ошибку в вызове выборки. Например.

fetch('bad-url').catch(err => 'Error but keep going')

Вот демо. Щелкните документ (вывод), чтобы запустить событие.

http://jsbin.com/vavugakere/edit?js,console,output

(Вам понадобится браузер с собственной реализацией Fetch, иначе будет выдана ошибка)

person D. Walsh    schedule 14.04.2017
comment
спасибо, действительно работает. Вы знаете, что делать в случае углового 2 http.get вместо fetch? - person Mikhail Linkov; 15.04.2017
comment
@MikhailLinkov Рад, что помог! Я парень React, который тоже любит RxJS. Я не знаю методов Angular. Но если http.get возвращает обещание, вы можете справиться с этим с уловкой. Если он возвращает наблюдаемую ошибку, есть разные способы справиться с этим в зависимости от ваших потребностей. - person D. Walsh; 15.04.2017
comment
Angular 2 http возвращает наблюдаемый, первый способ - это вызов toPromise, но вы говорите, что trere - это разные способы, второй - повторная подписка) также мне любопытно узнать, является ли это ошибкой или функцией такого поведения switchMap при ошибке, потому что нет вызова onComplete обратный вызов после onError - person Mikhail Linkov; 15.04.2017
comment
Похоже, я понял, нам нужно остановить распространение ошибки внутри switchMap, преобразовав ее в Observable. Но такое поведение switchMap до сих пор не интуитивно понятно, и я нигде не нашел его описания. Спасибо @D. Еще раз Уолш - person Mikhail Linkov; 15.04.2017