Javascript 链接可观察对象的正确方法是什么<;无效>;使用打字脚本(角度)?

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

我一直在寻找正确/最好/正确的方法来链接一些可观察的方法。我读过关于使用管道()和映射()等的内容,但我不是100%完全理解。基础是我有一些行动要执行,有些需要按顺序执行,有些不需要。 下面是我需要调用的4种方法

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();
    }
  });