Angular 确保在运行第二个(复杂的)可观察对象之前运行第一个可观察对象

Angular 确保在运行第二个(复杂的)可观察对象之前运行第一个可观察对象,angular,rxjs,Angular,Rxjs,我在排序两个观测值时遇到了一些问题,因此第一个在第二个之前运行。我开始尝试在没有任何运气的情况下使用concatMap。。。也许这不是最好的选择,但基于对高阶映射运算符的描述,我认为这是最好的选择 需要运行的第一个可观察对象非常简单: this.workflowService.getFolderActions().subscribe(tasks => { this.tasks = tasks; }); 第二个可观察对象需要tasks(或this.tasks)属性才能正常运行。第二可观

我在排序两个观测值时遇到了一些问题,因此第一个在第二个之前运行。我开始尝试在没有任何运气的情况下使用
concatMap
。。。也许这不是最好的选择,但基于对高阶映射运算符的描述,我认为这是最好的选择

需要运行的第一个可观察对象非常简单:

this.workflowService.getFolderActions().subscribe(tasks => {
  this.tasks = tasks;
});
第二个可观察对象需要
tasks
(或
this.tasks
)属性才能正常运行。第二可观察到:

this.route.data
.pipe(
  switchMap(x => {
    return this.route.paramMap;
  }))
.subscribe(params => {
  this.paymentId = params.get('id');
  this.task = this.workflowService.getTask(this.paymentId);
  this.paymentData = <PaymentData>this.task.actionData;

  const incompleteOptionalTasks = this.workflowService.getIncompleteOptionalTasks();
  const nextRequiredTask = this.getIncompleteRequired();
  this.nextTask = nextRequiredTask;

  if (!nextRequiredTask && incompleteOptionalTasks) {
    this.nextTask = this.tasks.find(task => task.id !== this.paymentId);
  } else if (nextRequiredTask) {
    this.nextTask = nextRequiredTask;
  }
});

…但我得到了一个错误:
声明了“任务”,但从未读取它的值。
但是我确信我没有正确地处理这个问题,因此非常感谢任何帮助。

考虑以以下方式实现它:

this.workflowService.getFolderActions()。
烟斗(
点击(任务=>this.tasks=tasks),
switchMapTo(this.route.paramMap)
)
.订阅(参数=>{
this.paymentId=params.get('id');
this.task=this.workflowService.getTask(this.paymentId);
this.paymentData=this.task.actionData;
const incompleteOptionalTasks=this.workflowService.getIncompleteOptionalTasks();
const nextRequiredTask=this.getIncompletRequired();
this.nextTask=nextRequiredTask;
如果(!nextRequiredTask&&未完成可选任务){
this.nextTask=this.tasks.find(task=>task.id!==this.paymentId);
}否则如果(下一个要求任务){
this.nextTask=nextRequiredTask;
}
});
或者,您可能希望在订阅功能中接收
任务
,而不是全局保存:

this.workflowService.getFolderActions()。
烟斗(
点击(任务=>this.tasks=tasks),
withLatestFrom(this.route.paramMap)
)
.subscribe(([tasks,params])=>{
this.paymentId=params.get('id');
this.task=this.workflowService.getTask(this.paymentId);
this.paymentData=this.task.actionData;
const incompleteOptionalTasks=this.workflowService.getIncompleteOptionalTasks();
const nextRequiredTask=this.getIncompletRequired();
this.nextTask=nextRequiredTask;
如果(!nextRequiredTask&&未完成可选任务){
this.nextTask=tasks.find(task=>task.id!==this.paymentId);
}否则如果(下一个要求任务){
this.nextTask=nextRequiredTask;
}
});

在您的情况下,正确选择了
switchMap
操作符,因为它可以访问第一个可观察值,您可以在其中对该值进行操作,接下来,您还必须返回可观察值

this.workflowService.getFolderActions()
 .pipe(
  switchMap((tasks ) => {
   this.tasks = tasks;
   return this.route.paramMap;
 })
 .subscribe(() => ...)

哇,这真是太有帮助了——我对最新from和
switchMapTo
操作符的
不太熟悉——现在正在阅读它们。非常感谢你,我真的很感谢你的帮助!
this.workflowService.getFolderActions()
 .pipe(
  switchMap((tasks ) => {
   this.tasks = tasks;
   return this.route.paramMap;
 })
 .subscribe(() => ...)