【问题标题】:Stop next execution of Rxjs observer?停止 Rxjs 观察者的下一次执行?
【发布时间】:2019-05-14 14:16:21
【问题描述】:

我正在尝试使用 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')
});

我怎样才能实现这个代码来停止“这不应该打印”?

【问题讨论】:

  • 尝试使用o.error('A mistake')而不是一般错误
  • 那实际上会执行错误子句...但它不会停止下一个要执行的异步代码
  • “不停止下一个异步代码执行”是什么意思?我可以看到“这不应该打印”没有打印
  • 你能用你的代码提供答案吗?我用不同的方式运行了几次,它总是打印控制台日志

标签: javascript node.js rxjs rxjs6


【解决方案1】:

这是让它与 ABOS 所述的observer.error 一起工作的方法。事实上,这是他的例子,而且很有效。

因此,出于文档目的,我用他在评论中的回答回答了这个问题。

ABOS answer

我只是认为,如果有人在尝试处理错误时遇到问题,则抛出错误,而不是按照需要的方式捕获和执行observer.error。

【讨论】:

    【解决方案2】:

    使用setTimeout 设置计时器后,您将不会阻止使用unsubscribe 执行它。

    您需要手动清除超时。

    请注意,您可以将超时保存在变量 var myTimeout = setTimeout(f,ms); 中,然后您可以取消 clearTimeout(myTimeout);

    阅读全文:

    【讨论】:

    • 是的,我知道这些例子,实际的实现只是作为异步代码的一个例子......所以我所拥有的是 async 和 await 调用......
    猜你喜欢
    • 2021-05-02
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2019-05-23
    相关资源
    最近更新 更多