Javascript Rxjs在管道中调用另一个订阅,并在管道中更改根订阅的变量

Javascript Rxjs在管道中调用另一个订阅,并在管道中更改根订阅的变量,javascript,angular,rxjs,Javascript,Angular,Rxjs,使用另一个订阅,我想设置一个来自根订阅的属性 所以我有这样的订阅: this.repository.getData(`api/cards/list`) .subscribe( res => { this.data = res as EmployeeCard[]; } ); export class EmployeeCard { id: number; employeeId: number; employeeFullName: string;

使用另一个订阅,我想设置一个来自根订阅的属性

所以我有这样的订阅:

this.repository.getData(`api/cards/list`)
.subscribe(
  res => {
    this.data = res as EmployeeCard[];
  }
);
export class EmployeeCard {
    id: number;
    employeeId: number;
    employeeFullName: string;
    companyId: number;
    cardId: number;
    cardNumber: string;
    currentSpendingLimit: string;
    limitResetDate: Date;
    cardUsageStatu: boolean;
    cardActiveDays: string;
    balance:string;
}
this.repository.getData(`api/cards/list`)
.pipe(
    //get card information with cardId (needs another request using EmployeeCard cardId property)
    //get balance using card barcode  (needs another http request with using barcode)
    //set employeecard balance propery
    //return employeecard model's balance to subscription
  )
.subscribe(
  res => {
    this.data = res as EmployeeCard[];
  }
);
我的员工卡模型如下:

this.repository.getData(`api/cards/list`)
.subscribe(
  res => {
    this.data = res as EmployeeCard[];
  }
);
export class EmployeeCard {
    id: number;
    employeeId: number;
    employeeFullName: string;
    companyId: number;
    cardId: number;
    cardNumber: string;
    currentSpendingLimit: string;
    limitResetDate: Date;
    cardUsageStatu: boolean;
    cardActiveDays: string;
    balance:string;
}
this.repository.getData(`api/cards/list`)
.pipe(
    //get card information with cardId (needs another request using EmployeeCard cardId property)
    //get balance using card barcode  (needs another http request with using barcode)
    //set employeecard balance propery
    //return employeecard model's balance to subscription
  )
.subscribe(
  res => {
    this.data = res as EmployeeCard[];
  }
);
因此,我必须从另一个api请求中获取
余额
。此请求需要卡片
条形码
值。我可以通过调用另一个返回卡片信息的请求来获取
条形码
。卡片请求应使用
carid
值进行调用,该值在
EmployeeCard
模型中返回

因此,我的新订阅应如下所示:

this.repository.getData(`api/cards/list`)
.subscribe(
  res => {
    this.data = res as EmployeeCard[];
  }
);
export class EmployeeCard {
    id: number;
    employeeId: number;
    employeeFullName: string;
    companyId: number;
    cardId: number;
    cardNumber: string;
    currentSpendingLimit: string;
    limitResetDate: Date;
    cardUsageStatu: boolean;
    cardActiveDays: string;
    balance:string;
}
this.repository.getData(`api/cards/list`)
.pipe(
    //get card information with cardId (needs another request using EmployeeCard cardId property)
    //get balance using card barcode  (needs another http request with using barcode)
    //set employeecard balance propery
    //return employeecard model's balance to subscription
  )
.subscribe(
  res => {
    this.data = res as EmployeeCard[];
  }
);
我如何使用Rxjs实现这一点

感谢

SwitchMap用例(可能有内部映射?)

SwitchMap用例(可能有内部映射?)


您必须将
switchMap
与选择器函数参数一起使用

函数getData(){ getEmpData() .烟斗( 开关图( emp=>getBalanlanceInfo(emp.Cardd), (环境管理计划、余额信息)=>{ /** *开关映射的选择函数变化 *使用源和内部可观察值执行逻辑 */ emp.balance=balanceInfo.balance; 返回emp; } ) ) .订阅(emp=>{ 控制台日志(emp); //在这里执行您的逻辑 }); }
您可以在Stackblitz中找到完整的示例。可以找到有关switchMap的更多信息。

您必须将
switchMap
与选择器函数参数一起使用

函数getData(){ getEmpData() .烟斗( 开关图( emp=>getBalanlanceInfo(emp.Cardd), (环境管理计划、余额信息)=>{ /** *开关映射的选择函数变化 *使用源和内部可观察值执行逻辑 */ emp.balance=balanceInfo.balance; 返回emp; } ) ) .订阅(emp=>{ 控制台日志(emp); //在这里执行您的逻辑 }); }
您可以在Stackblitz中找到完整的示例。有关switchMap的更多信息,请参见。

switchMap操作员这是否回答了您的问题@KurtHamilton不这不是开关地图操作员这能回答你的问题吗@KurtHamilton不,这不仅仅是选择器功能的参考。我是它的粉丝,但是RXJS团队已经不赞成它了,并且不止一次地重新引入了它。从他们的突发奇想中证明自己的未来,并使用一个内部映射功能。我不认为它在中已被弃用,而且我已经使用了一年多了。此外,有不止一种解决问题的方法,在我看来,这种方法比内部映射更优雅,也更容易阅读。rxjs 6.0.0发行说明:
switchMap | switchMapTo:switchMap和switchMapTo不再接受resultSelector参数,要获得相同的功能,请结合使用switchMap和map
。。。最近,他们(悄悄地)在某个时候重新引入了它。这是一个更好的代码,但他们倾向于快速而松散地进行破坏性的更改。为了省去你的麻烦,我迁移了一个大量使用结果选择器的整个应用程序。好吧,但我使用的是2019年4月发布的这篇文章当天的变体。您共享的变更日志来自2018年。这篇文章是4年前在rxjs 5之前写的,现在仍然使用更旧的语法。它于2019年4月更新。结果选择器存在多年,在v6中被弃用,然后在大约一年前的某个时候重新引入,没有任何解释或宣布。他们没有给出任何迹象表明这是否仅仅是一个向后兼容的东西,或者它是否会继续存在。它可以完全删除在v7时,他们取消了最后的rxjs兼容。。。你想怎么做就怎么做,但我会避免的。rxjs指南建议内部地图功能仍然只是选择器功能的参考。我是它的粉丝,但是RXJS团队已经不赞成它了,并且不止一次地重新引入了它。从他们的突发奇想中证明自己的未来,并使用一个内部映射功能。我不认为它在中已被弃用,而且我已经使用了一年多了。此外,有不止一种解决问题的方法,在我看来,这种方法比内部映射更优雅,也更容易阅读。rxjs 6.0.0发行说明:
switchMap | switchMapTo:switchMap和switchMapTo不再接受resultSelector参数,要获得相同的功能,请结合使用switchMap和map
。。。最近,他们(悄悄地)在某个时候重新引入了它。这是一个更好的代码,但他们倾向于快速而松散地进行破坏性的更改。为了省去你的麻烦,我迁移了一个大量使用结果选择器的整个应用程序。好吧,但我使用的是2019年4月发布的这篇文章当天的变体。您共享的变更日志来自2018年。这篇文章是4年前在rxjs 5之前写的,现在仍然使用更旧的语法。它于2019年4月更新。结果选择器存在多年,在v6中被弃用,然后在大约一年前的某个时候重新引入,没有任何解释或宣布。他们没有给出任何迹象表明这是否仅仅是一个向后兼容的东西,或者它是否会继续存在。它可以完全删除在v7时,他们取消了最后的rxjs兼容。。。你想怎么做就怎么做,但我会避免的。rxjs指南仍然建议使用内部映射功能