Rxjs 在什么情况下,实际使用take运算符?
我想了解为什么在下面给出的代码中使用Rxjs 在什么情况下,实际使用take运算符?,rxjs,Rxjs,我想了解为什么在下面给出的代码中使用take运算符 private _places = new BehaviorSubject<Place[]>( // places for initialization ); get places() { return this._places.asObservable(); } addPlace(title: string, description: string, price: number) { generatedId: st
take
运算符
private _places = new BehaviorSubject<Place[]>(
// places for initialization
);
get places() {
return this._places.asObservable();
}
addPlace(title: string, description: string, price: number)
{
generatedId: string;
newPlace: Place;
// code to initialize newPlace
return this.http.post<{name: string}>(
'https://ionic-angular-ef2f8.firebaseio.com/offered-places.json',
{...newPlace, id: null})
.pipe(
switchMap(response => {
generatedId = response.name;
return this.places;
}),
take(1),
tap(places => {
newPlace.id = generatedId;
this._places.next(places.concat(newPlace));
})
);
}
private\u places=新行为主体(
//初始化的位置
);
获得位置{
返回此项。_places.asObservable();
}
地址(标题:string,描述:string,价格:number)
{
generateId:字符串;
新址:新址;
//初始化newPlace的代码
返回this.http.post(
'https://ionic-angular-ef2f8.firebaseio.com/offered-places.json',
{…newPlace,id:null})
.烟斗(
开关映射(响应=>{
generatedId=response.name;
把这个还给我;
}),
以(1)为例,
点击(位置=>{
newPlace.id=generateId;
这个._places.next(places.concat(newPlace));
})
);
}
post
请求返回一个可观察的
,我们在switchMap
操作符中从中获取一个值(注意,在调用switchMap
之前,我们不获取一个值)。在switchMap
中,我们用从\u places
获取的新的可观察对象替换可观察对象,即行为主体
对象。在switchMap
之后,我们使用take
操作符。
我们为什么不跳过使用
操作符,直接使用点击
?我们是否从一个可观察对象中获取一个值,因为该可观察对象是由一个主体生成的?谁能详细解释take
操作符的用例
更新
我怀疑我应该在switchMap
之后使用take
操作符的原因是switchMap
返回从类型为BehaviorSubject
的对象接收到的可观测值,该对象保存发出的值。你可以订阅这样的BehaviorSubject
object并获取最近发出的值-这正是我所做的。httpClient.post()
发出一个next
通知和一个complete
通知
但是,他们正在使用switchMap
将另一个可观察对象合并到链中(this.places
)switchMap()
在其源和内部可观察对象完成之前不会完成,因此他们使用take(1)
在的第一次发射后完成该链。放置这是一个行为主体
,直到您有意调用complete()
后才会完成
这是一个非常类似于使用takeUntil()
来完成链的用例takeUntil()
始终必须是链中的最后一个运算符,因为完成对switchMap()
,concatMap()
。。。不一定能完成整个链条。更多详情请参见此我知道switchMap
将以前的可观测值替换为新的可观测值(它不会合并)。我怀疑第一个可观察(从this.http.post
接收)是在switchMap
工作后完成的。我问了这个问题,因为没有take(1)
操作符,此代码就不能工作。我不知道为什么。(我在代码调用addPlace
方法中取消订阅tap
返回的可观察对象)那么调用addPlace()的人可能依赖于它的完整句柄否,它不依赖它,当它的组件被销毁时它取消订阅(我在那里使用takeUntil
)。