Javascript 链接可观察对象的正确方法是什么<;无效>;使用打字脚本(角度)?
我一直在寻找正确/最好/正确的方法来链接一些可观察的方法。我读过关于使用管道()和映射()等的内容,但我不是100%完全理解。基础是我有一些行动要执行,有些需要按顺序执行,有些不需要。 下面是我需要调用的4种方法Javascript 链接可观察对象的正确方法是什么<;无效>;使用打字脚本(角度)?,javascript,angular,typescript,rxjs,observable,Javascript,Angular,Typescript,Rxjs,Observable,我一直在寻找正确/最好/正确的方法来链接一些可观察的方法。我读过关于使用管道()和映射()等的内容,但我不是100%完全理解。基础是我有一些行动要执行,有些需要按顺序执行,有些不需要。 下面是我需要调用的4种方法 createOrder(order:Order):Observable<void>{ return new Observable((obs)=> //Do Something obs.co
createOrder(order:Order):Observable<void>{
return new Observable((obs)=>
//Do Something
obs.complete();
)
}
updateCurrentStock(order:Order):Observable<void>{
return new Observable((obs)=>
//Do Something
obs.complete();
)
}
updateSalesSummary(order:Order):Observable<void>{
return new Observable((obs)=>
//Do Something
obs.complete();
)
}
updateAnotherDocument(order:Order):Observable<void>{
return new Observable((obs)=>
//Do Something
obs.complete();
)
}
这是可行的,但我不确定这是否是正确/最干净的方法,也不确定将来是否存在任何可能的问题。使用concat
concat将按顺序订阅您的流(在前一个流完成之前不启动下一个流)
这应该大致相当
这里的一个区别是,与mergeMap
不同,您没有转换api调用的输出,它仍然会被发出。因为您没有对订阅中的next
回调执行任何操作,所以在这种情况下,它看起来仍然类似
concat(
这个.createOrder(订单),
此.updateCurrentStock(订单),
分叉连接([
本文件更新了LessSummary(订单),
此.updateAnotherDocument(订单)
])
).订阅({
错误:concosle.log,
complete:()=>console.log('completed');
});
旁白: 下面是我将如何重新编写您的原始代码,使其更易于阅读
this.createOrder(order).pipe(
mergeMap(=>this.updateCurrentStock(order)),
合并映射(=>forkJoin([
本文件更新了LessSummary(订单),
此.updateAnotherDocument(订单)
]),
).订阅({
错误:(err)=>{
控制台日志(err);
obs.error(err);//有很多rxjs操作符,我建议您阅读
当你有一个可观察的,取决于他人的价值使用
例如:
constuserid$:可观察;
函数getUserData$(userId:number):可观察{
//yourService.fetchUser(userId);
}
userId$.pipe(switchMap((userId:number)=>getUserData$(userId));
如果您不关心订单,可以使用:
- 如果要在所有观测值完成时发出最后一个值:
- 如果要像任何可观察对象发射值一样发射每个值:
例如:
constuserid$:可观察;
函数getUserAge$(userId:number):可观察{
// ...
}
函数getUserName$(userId:number):可观察{
// ...
}
userId$.pipe(
switchMap((用户ID:number)=>
forkJoin([getUserAge$(userId),getUserName$(userId)])
)
);
在您的情况下,我认为顺序无关紧要,因为您的观察对象都不需要来自上一个的数据。因此我认为您应该使用combinelateest
。
如果发射的顺序和内部观测的订阅是重要的,试试看
var tasks = pipe(
flatMap(e => this.createOrder(order)),
flatMap(e => this.updateCurrentStock(order)),
flatMap(e => forkJoin([this.updateSalesSummary(order),this.updateAnotherDocument(order)])),
);
of(undefined).pipe(tasks).subscribe({
error: (err) => {
console.log(err);
obs.error(err);
},
complete: () => {
console.log('completed');
obs.complete();
}
});