Angular 如何在动态阵列中设置订阅

Angular 如何在动态阵列中设置订阅,angular,rxjs,Angular,Rxjs,我正处于学习Angular的早期阶段,我正试图了解RxJS、Observable等。可能我在语法和概念方面都有问题 这里我有一个服务incidentService,它获取一系列事件并将它们显示在页面上。如果incident.requirementMet属性为true,则我希望incident.resolved属性在计时器上为列表中的每个事件更新。当导航到另一个视图时,我想取消所有订阅 以下是我迄今为止所做的尝试。围绕setIncidentSubscriptons和postIncident方法出现

我正处于学习Angular的早期阶段,我正试图了解RxJS、Observable等。可能我在语法和概念方面都有问题

这里我有一个服务incidentService,它获取一系列事件并将它们显示在页面上。如果incident.requirementMet属性为true,则我希望incident.resolved属性在计时器上为列表中的每个事件更新。当导航到另一个视图时,我想取消所有订阅

以下是我迄今为止所做的尝试。围绕setIncidentSubscriptons和postIncident方法出现了问题

角度v8.2 rxjsv6.4

从“@angular/core”导入{Component,OnInit,OnDestroy}; 从'rxjs'导入{订阅,可观察,计时器}; 从“../services/incident.service”导入{IncidentService}; 从“../models/Incident”导入{Incident}; @组成部分{ 选择器:“应用程序事件”, templateUrl:“./incident.component.html”, 样式URL:['./incident.component.scss'] } 导出类IncidentComponent实现OnInit、OnDestroy{ 私人附带订阅:订阅[]=[]; 事件:事件[]; constructorprivate incidentService:incidentService{} 恩戈尼特{ 这是一次意外事件; } 恩戈德斯特罗{ this.incidentSubscriptions.forEachsubscription=>subscription.unsubscripte; } GetEvents:无效{ this.incidentService.getIncidents .subscribeincidents=>{ 这.事件=事件; 此.setIncidentSubscriptons; }; } setIncidentSubscriptons:无效{ 让timerDelay=1000; 在这件事上,我是康斯特一号{ 如果满足此.Events[i].要求{ timerDelay+=2000; 这个是.incidentSubscriptions.push 定时器1 订阅 =>{this.postIncidentthis.Events[i],timerDelay;} ; } } } 事后:事件,时间显示:编号{ 如果事件已解决<100{ 设置超时=>{ 事件已解决+=1; this.incidentService.updateIncidentincident.subscribe=>{ 此。后事故,时间显示; }; },timerDelay; } } }
您应该尝试使用RxJS操作符来完成所有逻辑,并构建一个可观察对象,以这种方式完成所有任务。只订阅一次最终可观察到的内容

我假设this.incidentService.updateIncidentincident只发出一次,然后完成,并且不使用发出的值

从“rxjs”导入{timer,forkJoin,observeable,Subject}; 从“rxjs/operators”导入{tap、concatMap、switchMap、takeUntil、take}; 私人onDestroy$=新主题; 恩戈尼特{ this.getAndUpdateIncidents.subscribe; } 恩戈德斯特罗{ this.onDestroy$.next; 此.onDestroy$.complete; } getAndUpdateIncidents:Observable{/'any'是this.incidentService.UpdateIncident返回的任何内容 返回此.incidentService.getIncidents.pipe TapIncents=>this.Incents=Incents,//分配返回的事件 switchMapincidents=>this.updateIncidentsincidents,//切换到更新事件的可观察对象 takeUntilthis.onDestroy$//在销毁时取消订阅 } 更新事件事件:事件[]:可观察{ 让timerDelay=1000; return forkjoinEvents//使用forkJoin并行执行一个可观察的数组 .filterincident=>incident.requirementMet//只接受符合要求的事件 .mapincident=>{//映射到定期更新事件的可观察对象 timerDelay+=2000; timer0,timerDelay.pipe//timer将以给定的延迟发出数字 take100,//只取100个数字 concatMap \=>{//映射到更新事件的可观察对象, //concatMap确保下一次更新仅在上一次更新完成时执行 事件已解决+=1; 返回此.incidentService.UpdateIncident; } }; }
你能再解释一下吗?你想让计时器定期启动吗?然后你需要第二个论点。IncidentService中的事件列表是如何操作的?对我来说,这里似乎有太多的订阅。感谢您的解释和示例,这正是我所需要的!