звоните и ждите в интервале, используя подписку в Angular 6 - PullRequest
0 голосов
/ 11 сентября 2018

Я вызываю метод каждые 10000 раз.Я хочу, чтобы эта функция getAllNotificationsActed0() вызывалась каждые 10 секунд, и если данные не поступили в этот интервал, не вызывайте функцию снова.Если данные получены в течение 10 секунд, вызывается функция, если данные не поступили в течение 10 секунд после функции, не вызывайте, а ждите.

service.ts

public NotifGetAllActedNoActive(): Observable<Notifications[]> {
  let headers = new Headers();
  headers.append('x-access-token', this.auth.getCurrentUser().token);
  return this.http.get(Api.getUrl(Api.URLS.NotifGetAllActedNoActive), {
    headers: headers
  })
    .map((response: Response) => {
      let res = response.json();
      if (res.StatusCode === 1) {
        this.auth.logout();
      } else {
        return res.StatusDescription.map(notiff => {
          return new Notifications(notiff);
        });
      }
    });
}

component.ts

ngOnInit() {
  this.subscription = Observable.interval(10000).subscribe(x => {
    this.getAllNotificationsActed0();
  });
}

getAllNotificationsActed0() {
  this.notif.NotifGetAllActedNoActive().subscribe(notification0 => {
    this.notification0 = notification0;
    if (this.isSortedByDate) {
      this.sortbydate();
    }
  });
}

Есть идеи, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Попробуйте это в вашем компоненте:

import { takeUntil } from 'rxjs/operators';
import { Subject, timer } from 'rxjs';

private _destroy$ = new Subject();
ngOnInit() {
    this.getAllNotificationsActed0();
}
ngOnDestroy() {
    this._destroy$.next();
}
getAllNotificationsActed0() {
    this.notif.NotifGetAllActedNoActive()
     .pipe(takeUntil(this._destroy$))
     .subscribe(notification0 => {
        this.notification0 = notification0;
        if (this.isSortedByDate) {
            this.sortbydate();
        }
        timer(10000).pipe(takeUntil(this._destroy$))
            .subscribe(t => this.getAllNotificationsActed0() );
    });
}

Это хороший подход, чтобы остановить уничтожение канала на компоненте.Вы можете использовать объект Subject для достижения этой цели.Также вы можете остановить любые трубы, которые вам нужно остановить при разрушении компонента.

0 голосов
/ 11 сентября 2018

Попробуйте это

Вы можете оставить флаг, чтобы найти ожидающий запрос

//New Flag
requestWaiting : boolean = false;

public NotifGetAllActedNoActive(): Observable<Notifications[]> {
let headers = new Headers();
headers.append('x-access-token', this.auth.getCurrentUser().token);
return this.http.get(Api.getUrl(Api.URLS.NotifGetAllActedNoActive), {
  headers: headers
})
  .map((response: Response) => {
    this.requestWaiting = false;
    let res = response.json();
    if (res.StatusCode === 1) {
      this.auth.logout();
    } else {
      return res.StatusDescription.map(notiff => {
        return new Notifications(notiff);
      });
    }
 });
}

используйте флаг в том месте, где вы вызываете метод внутри интервала

ngOnInit() {
  this.subscription = Observable.interval(10000).subscribe(x => {
     if(!this.requestWaiting){
         this.requestWaiting = true;
         this.getAllNotificationsActed0();
     }
  });
}
  getAllNotificationsActed0() {
    this.notif.NotifGetAllActedNoActive().subscribe(notification0 => {
      this.notification0 = notification0;
      if (!this.isSortedByDate) {
        this.sortbydate();
      }
    });
  }

Уже запущенная наблюдаемая будет ждать ответа. Я надеюсь, что это поможет вам

...