Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular 5,rxjs-仅当observable处于运行中间时,才等待它完成,然后再运行另一个进程_Javascript_Angular_Typescript_Rxjs_Observable - Fatal编程技术网

Javascript Angular 5,rxjs-仅当observable处于运行中间时,才等待它完成,然后再运行另一个进程

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

我有一个计时器在我的主要组成部分3秒。在计时器内,我执行http调用-

    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请求的执行,直到轮询请求完成。@danda
first
就像一个过滤器。它让与给定谓词匹配的第一项通过,然后完成。因此,与谓词不匹配的项或以后的项将被丢弃。我在代码中添加了一些解释。我的答案是解决你的问题?谢谢,是的,真的很有帮助!
this.timer = timer(3000, 3000);
        this.timerObservable = this.timer.subscribe(x => {
           this.http.get(URL).subscribe(()=>{
               this.callService.timerCompleted();
           });
        });