2017-02-16 2 views
0

У меня есть наблюдаемый, который выдаст ошибку, когда счетчик будет достигать 5:Что произойдет с дополнительными щелчками

let counter = 0; 

const source2 = Rx.Observable.of(true) 
    .map(() => [1,2,3,4,5]); 

source2 
    .subscribe((x) => console.log(x), 
       (err) => console.log(err), 
       () => console.log("complete 2!!")); 


const source1 = Rx.Observable.fromEvent(document, 'click') 
    .do(() => console.log("Document clicked!")) 
    .do(() => counter++) 
    .map(() => { 

     if(counter > 5) { 
     counter = 0; 
     throw new Error("Counter is too big!"); 
     } 

     return true; 

    }) 
    .catch((oError, oSource$) => source2) 


source1 
    .subscribe((x) => console.log(x), 
       (err) => console.log(err), 
       () => console.log("complete!!")); 

Когда ошибку вышла метало, то он переключится на source2, как вы можете видеть на код выше.

Когда я делаю дальнейшие щелчки по документу, ничего не произойдет, почему? Что произойдет с дальнейшими щелчками?

ответ

1

Это одна из основных rxjs-парадигм: Всякий раз, когда ошибка возникает в потоке (независимо от того, если он является прямым throw new Error(..) или Observable.throw(...)) подписной поток автоматически завершена и абоненты отписался.

Таким образом, поведение ожидается.

К исправить это в вашем личном деле: не выкидывайте ошибку, если вы не хотите, чтобы ваш поток остановился, и если вы не хотите повторно подписываться вручную.

Дополнение: catch-operator просто позволяет реагировать на ошибку в потоке, независимо от любого абонента - сам поток все еще будет завершен, хотя здесь имя catch дает ложное впечатление. - Вы можете «повторить» наблюдаемый, возвращая исходный источник в catch -операторе, который будет эффективно создавать новый поток на основе этого источника, однако старый поток все равно будет завершен.

+0

Как общий __personal__ side-note: __Don't__ выдавать исключения для семантических вопросов, например, в случае, когда некоторые данные достигают некоторого семантического предела. (Я не знаю вашего кода, но он выглядит так). Ошибки/исключения должны быть выбраны для проблем __technical__, например, например. когда требуемый параметр отсутствует или если полученные данные не имеют ожидаемой структуры. - Может быть, вы можете описать свой желаемый сценарий - я уверен, что это может быть обработано rxjs элегантным способом, не порождая ошибок. – olsn

+0

Что я не понимаю, когда я возвращаюсь в методе catch, источник вроде: '.catch ((oError, oSource $) => oSource $)', то подписчики не будут отписаны, почему? –

+0

'catch'-operator - это просто оператор-оператор, который позволяет реагировать на ошибку в потоке независимо от любого абонента - поток все равно будет завершен – olsn

Смежные вопросы