Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否停止下一次执行Rxjs observer?_Javascript_Node.js_Rxjs_Rxjs6 - Fatal编程技术网

Javascript 是否停止下一次执行Rxjs observer?

Javascript 是否停止下一次执行Rxjs observer?,javascript,node.js,rxjs,rxjs6,Javascript,Node.js,Rxjs,Rxjs6,我正在尝试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 no

我正在尝试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
我需要做的是停止下一次执行,即使我取消订阅,它也不会停止下一次执行

我也试过这样:

让认购

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')
});

如何实现此代码以停止“此不应打印”

在使用
setTimeout
设置计时器后,您将不会使用
取消订阅来阻止其执行

您需要手动清除超时

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

阅读更多:


使用
setTimeout
设置计时器后,您将不会使用
取消订阅
阻止计时器的执行

您需要手动清除超时

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

阅读更多:


这是一种使其与observer.error一起工作的方法,正如ABOS所述。事实上,这是他的例子,它是有效的

因此,为了便于记录,我用他在评论中的回答回答了这个问题


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

这是让observer.error正常工作的方法,正如ABOS所述。事实上,这是他的例子,它是有效的

因此,为了便于记录,我用他在评论中的回答回答了这个问题


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

是的,我知道这些示例,实际实现只是异步代码的一个示例。。。所以我有异步和等待调用…是的,我知道这些例子,实际的实现就像异步代码的一个例子。。。因此,我使用的是异步并等待调用…尝试使用
o.error('A error')
而不是实际执行error子句的泛型errorWell。。。但是它不会停止下一个要执行的异步代码“不会停止下一个要执行的异步代码”是什么意思?我可以看到“这不应该打印”没有打印。你能用你的代码提供一个答案吗?我用不同的方法运行了几次,它总是在这里打印控制台日志,您可以尝试使用
o.error('A error')
而不是实际执行error子句的通用errorWell。。。但是它不会停止下一个要执行的异步代码“不会停止下一个要执行的异步代码”是什么意思?我可以看到“这不应该打印”没有打印。你能用你的代码提供一个答案吗?我用不同的方式运行了几次,它总是在这里打印控制台日志