【发布时间】: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