Остановить следующее выполнение наблюдателя Rxjs? - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь использовать базовый вариант использования наблюдателя Rxjs.Вот что я делаю:

const { Observable } = require('rxjs');

Observable.create(o => { 
  setTimeout(() => o.next('hi'), 1000); 
  setTimeout(() => { throw new Error('A mistake') }, 1500); 
  setTimeout(() => o.next('this should not print'), 2000) }
).subscribe({
  next: x => console.log(x),
  error: y => console.log('error', y),
  complete: () => console.log('done')
});

Результат этого следующий:

> hi
Error: A mistake
    at Timeout.setTimeout [as _onTimeout] (repl:1:89)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)
> this should not print

Что мне нужно сделать, это остановить выполнение следующего, и даже еслиУ меня unsubscribe моя подписка, она не останавливает следующее выполнение.

Я тоже так пробовал:

давай подписку;

let source = Observable.create(o => { 
  try {
    setTimeout(() => o.next('hi'), 1000); 
    setTimeout(() => { throw new Error('A mistake') }, 1500); 
    setTimeout(() => o.next('this should not print'), 2000) 
  } catch (e) {
    subscription.unsubscribe();
    return 'error';
  }
});
subscription = source.subscribe({
  next: x => console.log(x),
  error: y => console.log('error', y),
  complete: () => console.log('done')
});

но шансов нет ...это не остановило.

То, что у меня есть, так как код не просто установлен тайм-аут У меня есть асинхронный и ожидающий код, подобный этому:

let subscription;

let source = Observable.create(async o => { 
  try {
    o.next(await anEvent()); 
    o.next(await anEventThatThrowsAnException()); 
    o.next(await anEventThatIWantToAvoidDueToTheException()); 
  } catch (e) {
    subscription.unsubscribe();
    return 'error';
  }
});
subscription = source.subscribe({
  next: x => console.log(x),
  error: y => console.log('error', y),
  complete: () => console.log('done')
});

Как я могу добиться этого кода, чтобы остановить "этоне должен печатать "?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Это способ заставить его работать с Observer.error, как заявлено ABOS.На самом деле это его пример, и он работает.

Так что просто для целей документации я ответил на этот вопрос с его ответом из комментария.

ABOS answer

Я просто подумал, что если у кого-то возникли проблемы при попытке обработать ошибки, выбрасывает ошибку вместо того, чтобы перехватывать и запускать Observer.error требуемым образом.

0 голосов
/ 13 декабря 2018

После того, как вы установите таймер с помощью setTimeout, вы не помешаете его выполнению с помощью unsubscribe.

Вам нужно будет вручную сбросить время ожидания.

Обратите внимание, что вы можете сохранить свои тайм-ауты в переменных var myTimeout = setTimeout(f,ms);, затем вы можете отменить затем clearTimeout(myTimeout);

Подробнее:

...