何时在rxjs中使用asObservable()?

何时在rxjs中使用asObservable()?,rxjs,rxjs5,Rxjs,Rxjs5,我想知道以下的用法是什么: 根据文件: 一种可观察的序列,它隐藏了 源序列 但是为什么需要隐藏序列呢?何时使用Subject.prototype.asObservable() 这样做的目的是防止对象的“观察者端”从API中泄漏。基本上是为了防止在您不希望人们能够“下一步”进入结果可观察对象时出现泄漏的抽象 例子 (注意:这并不是您应该如何将这样的数据源变成可观察的,相反,您应该使用newobservable构造函数,见下文) const myAPI={ getData:()=>{ 常量主题=新主

我想知道以下的用法是什么:

根据文件:

一种可观察的序列,它隐藏了 源序列

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

何时使用Subject.prototype.asObservable() 这样做的目的是防止对象的“观察者端”从API中泄漏。基本上是为了防止在您不希望人们能够“下一步”进入结果可观察对象时出现泄漏的抽象

例子 (注意:这并不是您应该如何将这样的数据源变成可观察的,相反,您应该使用
newobservable
构造函数,见下文)

const myAPI={
getData:()=>{
常量主题=新主题();
const source=new SomeWeirdDataSource();
source.onMessage=(data)=>subject.next({type:'message',data});
source.onOtherMessage=(data)=>subject.next({type:'othermessage',data});
返回subject.asObservable();
}
};
现在,当有人从
myAPI.getData()
获得可观察的结果时,他们不能
在结果中添加值:

const result=myAPI.getData();
result.next('LOL hax!');//抛出错误,因为'next'不存在
不过,您通常应该使用
newobservable()
在上面的例子中,我们可能正在创建一些我们不想创建的东西。首先,
getData()
不像大多数可观察对象那样懒惰,它将立即创建底层数据源
SomeWeirdDataSource
(可能还有一些副作用)。这也意味着,如果您
重试
重复
得到的可观察结果,它将不会像您认为的那样工作

最好将数据源的创建封装在您的observable中,如下所示:

const myAPI={
getData:()=>返回新的可观察对象(订阅服务器=>{
const source=new SomeWeirdDataSource();
source.onMessage=(data)=>subscriber.next({type:'message',data});
source.onOtherMessage=(data)=>subscriber.next({type:'othermessage',data});
return()=>{
//更好的是,现在我们可以拆除数据源进行取消!
source.destroy();
};
});
}

通过上面的代码,任何行为,包括使其“不懒惰”都可以使用RxJS的现有操作符在可观察的基础上合成。

A
既可以充当
观察者
也可以充当
可观察者

Obervable
有两种方法

  • 订阅
  • 退订
每当您订阅一个可观察的
时,您就会得到一个
观察者,该观察者上有next、error和complete方法

您需要隐藏序列,因为您不希望流源在每个组件中公开可用。同样,您可以参考
@BenLesh
的示例


注:当我第一次使用反应式Javascript时,我无法理解可观察的代码。因为我必须确保我清楚地理解了基础知识,然后选择可观察的

德克萨斯州本。。。一直在关注你的东西。。。感谢您对我们的大力支持RX@Shardul... 订阅结果:
result.subscribe(value=>doSomething(value))
@bentaliados是的,每次
返回subject.asObservable()这将是一个新的可观察的。您将有一个Subject成员变量,onMessage/onOtherMessage将在条件中声明,或者在初始化时声明(不是每次调用)。我使用了这种方法,基于提供给
getData()
函数的参数,使用了
管道(filter())
。The@BenLesh,在您的第二个代码示例中,
主题
应该是
订阅者
?我还想在此验证:
主题是否应该。接下来的
行是
订阅者
。另外,“如果您重试或重复生成的可观察对象,它将不会像您认为的那样工作。”您能更具体地说吗?你的意思是每次调用
getData
时都会发生
newsomeweirddatasource()
,通过将其包装在
newobservable
中,可以使实例化等待到订阅。我想我不知道你什么时候会调用
getData
,而不使用
.subscribe
,所以我缺少那里的值。最后,您预计“拆除数据源”会发生什么情况?谢谢