如何在 RxJS 6 的管道中启动 observable?
How to start observable in the pipe in RxJS 6?
我的 Angular 项目中有这个 RxJS 代码:
settingsService.getSetting('setting-name').pipe(
map((setting: SettingInterface) => {
// ...
return setting;
}),
tap((setting: SettingInterface) => this.settingService.save(setting)),
map((setting: SettingInterface) => {
// ...
})
);
在此代码中,this.settingService.save(setting)
也是一个 Observable
,但未订阅。
如何在管道中启动这个 observable,等待它并继续?
重要:
save()
observable 必须在 prevoius map()
operator 之后开始
save()
observable 的结果与管道无关,我想删除它
save()
observable 必须在下一个 map()
operator 之前开始
有没有 RxJS 运算符可以做到这一点?
当您有一个依赖于另一个可观察对象的可观察对象时,您可以使用 RxJS 的高阶映射运算符之一,例如 switchMap
、concatMap
、flatMap
或 exhaustMap
.每个人都有自己的目的。 Here's 一个很好的破败。本质上,在订阅后,他们将一个可观察值转换为另一个,然后 return 修改后的可观察值。
我会用switchMap
来说明。
settingsService.getSetting('setting-name').pipe(
map((setting: SettingInterface) => {
// ...
return setting;
}),
switchMap((setting: SettingInterface) =>
this.settingService.save(setting).pipe(map(_ => setting))
),
map((setting: SettingInterface) => {
// ...
})
);
您会注意到我已经将另一个 map
通过管道传输到内部 obesrvable:.pipe(map(saved => setting))
。如果没有这个,下面的外部 map
将接收来自 this.settingService.save(setting)
的输出,而不是您需要的 setting
变量。
我的 Angular 项目中有这个 RxJS 代码:
settingsService.getSetting('setting-name').pipe(
map((setting: SettingInterface) => {
// ...
return setting;
}),
tap((setting: SettingInterface) => this.settingService.save(setting)),
map((setting: SettingInterface) => {
// ...
})
);
在此代码中,this.settingService.save(setting)
也是一个 Observable
,但未订阅。
如何在管道中启动这个 observable,等待它并继续?
重要:
save()
observable 必须在 prevoiusmap()
operator 之后开始
save()
observable 的结果与管道无关,我想删除它save()
observable 必须在下一个map()
operator 之前开始
有没有 RxJS 运算符可以做到这一点?
当您有一个依赖于另一个可观察对象的可观察对象时,您可以使用 RxJS 的高阶映射运算符之一,例如 switchMap
、concatMap
、flatMap
或 exhaustMap
.每个人都有自己的目的。 Here's 一个很好的破败。本质上,在订阅后,他们将一个可观察值转换为另一个,然后 return 修改后的可观察值。
我会用switchMap
来说明。
settingsService.getSetting('setting-name').pipe(
map((setting: SettingInterface) => {
// ...
return setting;
}),
switchMap((setting: SettingInterface) =>
this.settingService.save(setting).pipe(map(_ => setting))
),
map((setting: SettingInterface) => {
// ...
})
);
您会注意到我已经将另一个 map
通过管道传输到内部 obesrvable:.pipe(map(saved => setting))
。如果没有这个,下面的外部 map
将接收来自 this.settingService.save(setting)
的输出,而不是您需要的 setting
变量。