Javascript rxjs中的错误和完整方法是如何工作的?

Javascript rxjs中的错误和完整方法是如何工作的?,javascript,rxjs,Javascript,Rxjs,最近我读到了关于rxjs的文章。此代码来自文档 import { Observable } from 'rxjs'; const observable = new Observable(subscriber => { setTimeout(() => { subscriber.complete(); subscriber.next(1); }, 1000); }); observable.subscribe({ next(x) { console.

最近我读到了关于rxjs的文章。此代码来自文档

import { Observable } from 'rxjs';
 
const observable = new Observable(subscriber => {
  setTimeout(() => {
    subscriber.complete();
    subscriber.next(1);
  }, 1000);
});
 
observable.subscribe({
  next(x) { console.log('got value ' + x); },
  error(err) { console.error('something wrong occurred: ' + err); },
  complete() { console.log('done'); }
});
console.log('just after subscribe');

正如上面所说的,如果发送了错误或完整的通知,那么之后就不能再发送其他通知了。如何使用纯js在引擎盖下完成?有没有一种方法可以改变subscribe函数并在执行complete/error方法时动态返回?

RxJS的工作方式非常有趣。我在这里分享了我的观点。我试图讲述
可观察的.pipe
可观察的.subscribe
以及
主题.observators
如何在引擎盖下工作

但要点是这样的(同样,这是我花了一些时间阅读源代码后的观点):

RxJS通过链接列表实现其功能

基本上,有两个链表。一个是在
Observable.pipe()
的帮助下创建的,其节点由操作符定义(例如
filter
take
map
),另一个是在
Observable.subscribe()上创建的。这是订阅者列表

操作员随附
订户
实例。例如,
map
操作符具有
MapSubscriber
。在RxJS 7之前,运营商的订户就是这样被调用的,现在它使用了一种非常智能的方式来注入用户

如何用纯js在引擎盖下完成

如前所述,每个
订户都有
next()
error()
complete()
方法。例如,发生的情况如下:

错误(err?:any):无效{
如果(!this.isStopped){
this.isStopped=true;
这是一个错误(err);
}
}
isStopped
确保可以通过:

next(值?:T):无效{
如果(!this.isStopped){
这个._下一个(值!);
}
}

当然,这不是发生
错误
事件时发生的唯一事情,RxJS还负责拆卸逻辑,释放资源。

RxJS的工作方式非常有趣。我在这里分享了我的观点。我试图讲述
可观察的.pipe
可观察的.subscribe
以及
主题.observators
如何在引擎盖下工作

但要点是这样的(同样,这是我花了一些时间阅读源代码后的观点):

RxJS通过链接列表实现其功能

基本上,有两个链表。一个是在
Observable.pipe()
的帮助下创建的,其节点由操作符定义(例如
filter
take
map
),另一个是在
Observable.subscribe()上创建的。这是订阅者列表

操作员随附
订户
实例。例如,
map
操作符具有
MapSubscriber
。在RxJS 7之前,运营商的订户就是这样被调用的,现在它使用了一种非常智能的方式来注入用户

如何用纯js在引擎盖下完成

如前所述,每个
订户都有
next()
error()
complete()
方法。例如,发生的情况如下:

错误(err?:any):无效{
如果(!this.isStopped){
this.isStopped=true;
这是一个错误(err);
}
}
isStopped
确保可以通过:

next(值?:T):无效{
如果(!this.isStopped){
这个._下一个(值!);
}
}

当然,当
错误事件发生时,这不是唯一发生的事情,RxJS还负责拆卸逻辑,释放资源。

当一个可观察到的错误发生或完成时,它会死亡,因此它不会发出任何其他信息。你希望实现什么?是的。我用纯js重写了一个observable,所以我的意思是实现一些东西使它消亡(正如你所说的)。我试图在执行error/complete方法时提前返回,但正如Andrei的回答,阻止下一个方法是rxjs所做的。当一个可观察到的错误出现或完成时,它会死亡,因此它不会发出任何其他信息。你希望实现什么?是的。我用纯js重写了一个observable,所以我的意思是实现一些东西使它消亡(正如你所说的)。我试图在执行error/complete方法时提前返回,但正如Andrei的回答,阻止下一个方法是rxjs所做的。非常感谢。我试图在执行error/complete方法时提前返回,但没有想到只通过一个isStopped标志来阻止下一个方法。是的。非常感谢。我试图在执行error/complete方法时提前返回,但没有考虑只通过一个ISSTlock标志来阻止下一个方法。