Javascript Angular 5,rxjs-仅当observable处于运行中间时,才等待它完成,然后再运行另一个进程
我有一个计时器在我的主要组成部分3秒。在计时器内,我执行http调用-Javascript Angular 5,rxjs-仅当observable处于运行中间时,才等待它完成,然后再运行另一个进程,javascript,angular,typescript,rxjs,observable,Javascript,Angular,Typescript,Rxjs,Observable,我有一个计时器在我的主要组成部分3秒。在计时器内,我执行http调用- constructor(){ this.timer = timer(3000, 3000); this.timerObservable = this.timer.subscribe(x => { this.http.get(URL).subscribe(()=>{ //DO SOMETHING
constructor(){
this.timer = timer(3000, 3000);
this.timerObservable = this.timer.subscribe(x => {
this.http.get(URL).subscribe(()=>{
//DO SOMETHING
});
});
}
在另一个组件中,我有一个按钮,假设它执行不同的http调用,按下按钮调用sumbit函数-
submit(){
this.http.get("/sumbitForm").subscribe(()=> {
//DO SOMETHING
})
}
当用户单击按钮时,如果计时器正在运行(其中的http已被调用,但尚未解析),我希望在对按钮执行http调用之前等待,直到它被解析,但如果计时器未运行(上一次调用的时间尚未过),我希望立即执行它
我认为forkJoin和concat在这里是不相关的(这是一个计时器,不是一个我想等待它执行的“常规”订阅),我找不到一个很好的方法来实现它,知道吗 您可以使用角度主题
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class CallService {
private subject = new Subject<any>();
timerCompleted() {
this.subject.next();
}
checkTimer(): Observable<any> {
return this.subject.asObservable();
}
}
在计时器中添加以下代码
this.timer = timer(3000, 3000);
this.timerObservable = this.timer.subscribe(x => {
this.http.get(URL).subscribe(()=>{
this.callService.timerCompleted();
});
});
有关更多参考信息,您可以检查您需要在两个组件之间共享一些信息,即轮询请求何时进行以及何时未进行。您应该为此使用服务。将http请求逻辑移动到服务中,而不是直接在组件中使用HttpClient,这也是一种很好的做法。这允许您在一个位置执行常规错误处理。 我们把这项服务称为ApiService 蜂房服务
从'@angular/core'导入{Injectable};
从'@angular/common/http'导入{HttpClient};
从“rxjs”导入{Observable,BehaviorSubject,interval};
从“rxjs/operators”导入{switchMap,tap};
@可注射({providedIn:'root'})
出口级服务{
//使用BehaviorSubject通知侦听器正在进行的轮询请求。
//BahaviorSubject始终具有一个晚订阅者将使用的当前值
//订阅后立即收到
private pollRequestInProgress=新行为主体(false);
//将此行为主体作为可观察对象共享
public pollRequestInProgress$=pollRequestInProgress.asObservable();
构造函数(专用http:HttpClient)
doPoll(url:string):可观察的谢谢!你的意思是我需要在计时器中的订阅中调用timerCompleted()而不是clearMessage()?还有另一个问题-如果没有执行计时器,是否会执行.callService.checkTimer().subscribe(因为只有timeCompleted才会发出事件)是的,您需要调用timerCompleted()并且checkTimer()将不会订阅,直到您发出timeCompleted()事件,但是我需要在尚未调用计时器时也会调用我的http(因此不会发出事件),这是我的主要问题。然后你需要显示你的全部代码,在哪种情况下你的计时器被调用,在哪种情况下它没有被调用。因为你的计时器在构造函数中,它将被调用3秒钟。太好了,谢谢!但是“FeatureComponent”中的http如果在3000毫秒之前按下按钮,或者等待第一次“doingPollRequest.next(true)”,也会发生这种情况,“requestInProgress”的目的是什么在submit?@danda yes中,如果单击按钮并且没有轮询请求,http请求将立即执行。您可以在我发布的stackblitz中看到这种行为。requestInProgress
是doingPollRequest$
可观察值,它告诉您轮询请求当前是否正在进行nd if将等待http请求的执行,直到轮询请求完成。@dandafirst
就像一个过滤器。它让与给定谓词匹配的第一项通过,然后完成。因此,与谓词不匹配的项或以后的项将被丢弃。我在代码中添加了一些解释。我的答案是解决你的问题?谢谢,是的,真的很有帮助!
this.timer = timer(3000, 3000);
this.timerObservable = this.timer.subscribe(x => {
this.http.get(URL).subscribe(()=>{
this.callService.timerCompleted();
});
});