首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Angular for http-get定期续订订阅

使用Angular for http-get定期续订订阅
EN

Stack Overflow用户
提问于 2021-04-15 14:08:41
回答 1查看 83关注 0票数 0

我想在我的Angular前端定期从服务器调用一个方法。我只想收到当前的时间。我的问题是浏览器的内存使用量越来越大!

我不确定订阅是每秒续订一次,还是真的只有在触发时才续订。因此,如果呼叫需要几秒钟,订阅在这段时间内不会续订十次-作为一个初学者,我当然有可能在程序中犯了几个错误……

我的服务:

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

export interface timestamp {
    now: number;
}

@Injectable({
    providedIn: 'root'
})

export class FireCrewService {

    private api = 'api/';

    constructor(private http: HttpClient) { }

    getToday(): Observable<timestamp> {
        return this.http.get<any>(`${this.api}today`);
    }

}

和我的组件:

代码语言:javascript
复制
import { Component, OnInit, OnDestroy } from '@angular/core';
import { FireCrewService, timestamp } from '..//shared/fire-crew.service';

import { interval, of, Subject } from 'rxjs';
import { catchError, mergeMap, takeUntil } from 'rxjs/operators'

@Component({
    selector: 'app-default',
    templateUrl: './default.component.html',
    styleUrls: ['./default.component.css']
})

export class DefaultComponent implements OnInit, OnDestroy {

    today: timestamp | undefined;
    destroy$ = new Subject();

    constructor(private fs: FireCrewService) {
    }

    ngOnDestroy(): void {
        this.destroy$.next();
    }


    ngOnInit(): void {

    const myObserver = {
        next: (value: timestamp) => this.onNext(value),
        error: (err: string) => this.onError(err),
        complete: () => this.onComplete(),
    };

    interval(1000).pipe(
        mergeMap(
            () => this.fs.getToday().pipe(
                    catchError((err) => {
                    this.onError(err);
                    return of(err);
                    })
                )
            ), takeUntil(this.destroy$)
        ).subscribe(myObserver);

    }


    onNext(value: timestamp): void {
        this.today = value;
    }

    onError(value: string): void {
        console.log('Observer got a onError notification', value);
    }

    onComplete(): void {
        console.log('Observer got a complete notification')
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-29 20:26:03

我可以自己解决这个问题:

代码语言:javascript
复制
ngOnDestroy(): void {
  this.destroy$.next();
}

ngOnInit(): void {
  this.fs.getLast().pipe(takeUntil(this.destroy$)).subscribe(this.myObserver);
}

onNext(value: timestamp): void {
  this.timestamp = timestamp;
}

onError(value: string): void {
  setTimeout(() => this.fs.getLast()
  .pipe(takeUntil(this.destroy$)).subscribe(this.myObserver), 5000);
}

onComplete(): void {
  setTimeout(() => this.fs.getLast()
  .pipe(takeUntil(this.destroy$)).subscribe(this.myObserver), 1000);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67103095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档