Rxjs-在subscribe函数中等待
如何在rxjs subscribe函数中使用wait,并在继续处理事件之前解析promise 这是一个密码笔: 输出为:Rxjs-在subscribe函数中等待,rxjs,Rxjs,如何在rxjs subscribe函数中使用wait,并在继续处理事件之前解析promise 这是一个密码笔: 输出为: new quote 10 new quote 11 new end {end: 20} new quote 12 new end {end: 30} new quote 13 如我所需,输出为: new quote 10 new end {end: 20} new quote 11 new quote 12 new quote 13 问题是“quote 11”在getDa
new quote 10
new quote 11
new end {end: 20}
new quote 12
new end {end: 30}
new quote 13
如我所需,输出为:
new quote 10
new end {end: 20}
new quote 11
new quote 12
new quote 13
问题是“quote 11”在getData承诺解决之前激发,导致getData被调用两次
我认为switchMap应该能够处理这种情况。部分问题在于,您试图在可观察的上下文中使用承诺<代码>开关映射在外部可观察对象发出时取消订阅任何内部可观察对象,这仍然不是您想要的行为。你需要这样的东西:
间隔(500)。管道(
concatMap(data=>{//concatMap将新的发射放在队列中,等待每个内部可观察到的完成,然后再发射下一个
console.log('新报价',数据);
如果(数据>=state.end){
return from(getData());//创建一个Observable,在承诺解析时完成
}否则{
返回(false);//允许我们过滤掉未调用getData的状态
}
}),
过滤器(newEnd=>!!newEnd),//忽略未调用getData的任何内容
点击(newEnd=>{//仅当调用getData时)
state.end=newEnd;
log('get new end',state);
})
).subscribe();
使用
concatMap
缓存下一个值,因此每个步骤中的比较仅在前一个步骤完成后进行。将在继续之前解析从项目函数返回的可观察值,而不是承诺。switchMap
实际上取消订阅内部可观察值concatMap
是一个缓存排放物的工具,如果您想忽略外部排放物直到内部可见物完成,则exhaustMap
。
new quote 10
new end {end: 20}
new quote 11
new quote 12
new quote 13