先说问题场景,还是之前调整时间后的弹窗。先说理想的效果:首先要说明的是,并不是每个任务都有后继任务,即使有后继任务,如果后继任务不满足条件(start和deadline存在),也有不会弹出窗口。一开始我想靠弹窗组件来解决判断问题——弹窗打开后判断,不满足条件再关闭弹窗。虽然可以正常执行,而且弹窗基本肉眼看不到,但是多次测试后发现闪屏还是出现了,所以放弃了这种写法。先不管弹窗的顺序,先试试弹窗能不能正常调用。一开始想着在父组件中调用之前写的batchSettingTime方法来解决。先介绍一下这个方法:需要的参数:变化前的时间,变化后的时间,当前任务,当前任务的后继任务。该方法首先获取当前任务的后续任务的任务详情,即获取这些任务的开始和截止时间,然后判断这些任务中是否有需要展示的任务(开始/截止时间做完了)。调用弹出窗口。batchSettingTime(...){//post-tasks中是否有完全配置好的taskshavePostTasksAllDate=false;//订阅所有后置任务的任务详情letListOgPostTasks=[]asObservable[];postTasks.forEach(task=>{ListOfPostTasks.push(this.taskStore.dispatch(fetchTaskDetail,task.id))})//在处理combineLatest(ListOfPostTasks).subscribe(data=>{data.foreach(task=>{if(task.duedate&&task.startDate){havePostTasksAllDate=true;}})//如果满足条件,则调用弹窗if(havePostTasksAllDate){constchangeDate=newDate-oldDate;constdialogRef=this.util.thyDialog.open(xxxComponent,{passtask,changedate,oldDateintopop-upwindow})}//因为如果关闭后调用,弹出window组件已经被销毁,无法获取其中的变量,所以需要在关闭前处理dialogRef.beforeClosed().subScribeif(dialofRef.componentInstance.selectedTasks.lenth!=0&&dialogRef.componentInstance.beSubmit){dialogRef.componentInstance.selectedTasks.forEach(任务=>{this.taskDependentStore.fetchDependentTasks(task.id)this.taskDependentStore.select(TaskDependentStore.postDependentpiTask((dialogRef.afterClosed())),skip(1)).subscribe(data=>{//由于老观察者需要及时取消订阅,在弹窗关闭时取消订阅//因为select会返回两个Secondary内容,所以使用skip(1)跳过获取旧内容postTasks=data;this.taskStore.dispatch(fetchTaskDetail,task.id).subscribe(task=>{this.batchSettingTime(task.dueDate-changeDate,task.dueDate,task,postTasks)})})})}});}一开始因为没有及时取消对taskDependentStore.select(TaskDependentStore.postDependentTasks)的订阅,所以每次执行fetchDependentTasks都会触发订阅,每次打开新的弹窗都会触发之前的订阅,导致在弹出窗口的多个附加弹出窗口中。前面提到的select方法在正常情况下会触发两次,可以使用自定义变量获取第二个内容而不是第一个旧内容。但是这样写还是不规范,也不方便测试。如果有像combineLatest这样的rxjs算子,那么应该有类似只获取第二个可观察内容或者跳过第一个可观察内容的算子,查询rxjs官网后发现确实有。xxxObservable.pipe(skip(1)).subscribe({console.log('跳过第一次发送的内容')})经过测试,发现如果只有一个任务,上面的代码可以正常执行例如:Task1="Task2="Task3="Task4当我们更改任务1时,会弹出任务2的弹窗,如果我们更改任务2,则会弹出任务2的弹窗task3,以此类推。但是当我们更改多个并行任务时,就会出现问题——一次弹出四个弹窗,弹窗的内容还相互影响——任务二的后继者出现在任务三的弹窗中,任务三的后继者出现在任务二的弹窗中,猜测也是循环中多次执行fetchDependentTasks,以及任务的post-tasks造成的而后置任务的任务详情也会在弹窗组件中获取,这些也是store获取的,并且有多个Components调用同时缓存会造成混乱,所以我猜测只要解决了多弹窗的问题,弹窗任务混乱的问题应该就解决了。例如,以两个并行任务为例,猜测执行过程如下。但是这张图肯定有问题,因为我们使用了skip(1)来避免得到旧数据,然后去掉skip(1)再执行,发现弹窗生成了六次。此问题仍在解决中。那么为什么只有一项任务很好呢?因为它的执行过程如下: