gpt4 book ai didi

rxjs - 何时在 rxjs 中使用 asObservable() ?

转载 作者:行者123 更新时间:2023-12-03 05:46:56 25 4
gpt4 key购买 nike

我想知道 asObservable 有什么用? :

根据文档:

An observable sequence that hides the identity of the source sequence.

但是为什么需要隐藏序列?

最佳答案

何时使用Subject.prototype.asObservable()

这样做的目的是防止从 API 中泄露主题的“观察者端”。基本上是为了防止当您不希望人们能够“下一步”进入结果可观察值时出现泄漏抽象。

示例

(注意:这实际上不是将这样的数据源制作为 Observable 的方式,而是应该使用 new Observable 构造函数,请参见下文)。

const myAPI = {
getData: () => {
const subject = new Subject();
const source = new SomeWeirdDataSource();
source.onMessage = (data) => subject.next({ type: 'message', data });
source.onOtherMessage = (data) => subject.next({ type: 'othermessage', data });
return subject.asObservable();
}
};

现在,当有人从 myAPI.getData() 获取可观察结果时,他们无法将 next 值添加到结果中:

const result = myAPI.getData();
result.next('LOL hax!'); // throws an error because `next` doesn't exist

不过,您通常应该使用new Observable()

在上面的例子中,我们可能正在创建一些我们无意的东西。其一,getData() 不像大多数可观察对象那样是惰性的,它会立即创建底层数据源 SomeWeirdDataSource(可能还有一些副作用)。这也意味着,如果您重试重复生成的可观察值,它不会像您想象的那样工作。

最好将数据源的创建封装在可观察对象中,如下所示:

const myAPI = {
getData: () => return new Observable(subscriber => {
const source = new SomeWeirdDataSource();
source.onMessage = (data) => subscriber.next({ type: 'message', data });
source.onOtherMessage = (data) => subscriber.next({ type: 'othermessage', data });
return () => {
// Even better, now we can tear down the data source for cancellation!
source.destroy();
};
});
}

通过上面的代码,任何行为,包括使其“不懒惰”,都可以使用 RxJS 的现有运算符在可观察值之上进行组合。

关于rxjs - 何时在 rxjs 中使用 asObservable() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986548/

25 4 0
文章推荐: perl - 如何优雅地调用名称保存在变量中的 Perl 子例程?
文章推荐: javascript - 如何将改为
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com