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
)。