Angular 只调用一次开关映射后轻按

Angular 只调用一次开关映射后轻按,angular,rxjs,Angular,Rxjs,我对开关映射行为有问题 我选择了电子表格id,对于每个id,我都有一个对应的UI组件实例,我想在开始时做一个可视更改,然后做几个google电子表格API调用,最后做一个可视更改。请注意,gapi客户端在ngZone之外工作,为了使其正常工作,我使用ngZone.zone.run const-id=[1,2] 函数进程SelectedDS(ID){ 来自(ids) .烟斗( switchMap(id=>processId(id)), ) .订阅({ 下一步:值=>{ console.log('s

我对开关映射行为有问题

我选择了电子表格id,对于每个id,我都有一个对应的UI组件实例,我想在开始时做一个可视更改,然后做几个google电子表格API调用,最后做一个可视更改。请注意,gapi客户端在ngZone之外工作,为了使其正常工作,我使用ngZone.zone.run

const-id=[1,2]
函数进程SelectedDS(ID){
来自(ids)
.烟斗(
switchMap(id=>processId(id)),
)
.订阅({
下一步:值=>{
console.log('subscribe next')
此。_state.ids=[]//清除选定的ID
this.stateSubject.next([…this.\u state.data])//触发ui更新
},
})
}
函数processId(id){
返回(id)管道(
轻触(=>{
this.updateUI(id,STATE.start)//mutate STATE
this.stateSubject.next([…this.\u state.sheets])//触发ui更新
console.log('before',id)
}),
开关映射(()=>{
console.log('switchMap',id)
返回getSpreadsheet(id)
}),
轻触(=>{
console.log('after',id)
this.updateUI(id,STATE.end)//mutate STATE
this.zone.run(()=>{//因为getSpreadsheet在NgZone之外运行
this.stateSubject.next([…this.\u state.sheets])//触发ui更新
})
}),
)
}
获取电子表格(id){
返回叉连接({
响应1:最高级1(id),
响应2:最高级2(id),
}).烟斗(
映射(响应=>{
返回解析响应(response)
}),
)
}
我的问题是processId中的第二次点击不会触发。以下是我的输出的外观:

before, 1
switchMap, 1

before, 2
switchMap, 2
after, 2

subscribe next
我不知道这里到底出了什么问题,我非常感谢您对如何使其工作的任何帮助。
提前感谢您的帮助

看起来来自(ids)的可观测源
发射太快,
switchMap()
将在
getSpreadsheet(id)
发射之前取消订阅


因此,您可能正在寻找
concatMap()
mergeMap()

您确定
getSpreadsheet(id)
会发出任何
下一个
?@martin是的,它会发出,但只会发出一次。忘记将其添加到输出。。。问题变了,谢谢你指出这一点。我的意思是它第一次发射吗?看起来来自(ids)
的源可观测
发射速度太快,
switchMap
将在
getSpreadsheet(id)
发射之前取消订阅。因此,也许您正在寻找
concatMap
mergeMap
。@martin,谢谢,您是对的。你能给我一个恰当的答案吗?我可以结束这个问题。