Обновление данных в сервисе

Данные в API постоянно меняются. Как лучше всего обновить данные в Angular? API bitfinex.com

У меня есть сервис и компонент. В сервисе я загружаю данные с помощью get.

сервис:

getPrice(){

  return this.http.get('xxx');

}

компонент:

ngOnInit() {

   this.getPrices();

    setInterval(() => {
      this.getPrices();
    }, 5000);

  }

  getPrices(){
    this.tick.getPrice().subscribe(prices => {
      console.log(prices);
    });
  }

Как вы можете видеть в компоненте, я использую setInterval и обновляю его каждые 5 секунд.

Пытался обновить данные прямо в сервисе.

return interval(5000).pipe(

      // ignore new term if same as previous term
      distinctUntilChanged(),

      // switch to new search observable each time the term changes
      switchMap(() => this.http.get('xxx')),
    );

Но показывает данные только через 5 секунд.


person Ziomek    schedule 23.07.2018    source источник
comment
Можете ли вы использовать веб-сокеты со своим сервером и внешним интерфейсом? Потому что, может быть, они лучше, чем долгий опрос для этого приложения.   -  person Reinstate Monica    schedule 23.07.2018


Ответы (4)


return interval(5000).pipe(

  // ignore new term if same as previous term
  distinctUntilChanged(),

  // switch to new search observable each time the term changes
  switchMap(() => this.http.get('xxx')),
);

Проблема в этом блоке кода. interval(5000) будет излучать только один раз каждые 5 секунд после первых 5 секунд. Это то поведение, которое вы наблюдали. Вы можете использовать timer(0,5000), чтобы получить наблюдаемое, которое начинается с 1 испускания, а затем повторяется каждые 5 секунд.

Кроме того, я не уверен, что distinctUntilChanged() должен здесь делать. interval(5000) будет выдавать увеличивающееся число каждые 5 секунд, поэтому значение всегда будет уникальным.

Также кажется, что после switchMap, в котором нет необходимости, стоит дополнительная запятая.

person Dorus    schedule 23.07.2018

Я пытался воссоздать вашу проблему в этом стеке, но не смог.

Не могли бы вы попробовать это и сказать мне, что с ним не так (кроме CORS, который является серверной стороной, и вы ничего не можете с этим поделать)

Возможно, ваша проблема связана с этим:  Политика API

Вы не можете опрашивать API каждые 5 секунд (вы их DDOS: P) в соответствии с их политикой. Вы можете делать ~ 10 запросов в минуту.

Попробуйте их api веб-сокета, который передает вам данные при изменении без необходимости для опроса от клиента (сервер будет отправлять вам новые данные, когда они становятся доступными, вам просто нужно обработать их).

person Reinstate Monica    schedule 23.07.2018
comment
кроме CORS, который является серверной частью, и вы ничего не можете с этим поделать ну это больше зависит от клиента, чем от сервера, если честно. - person Antoniossss; 23.07.2018

1) Это будет работать в фоновом режиме, если вы не уничтожите свои слушатели событий при перенаправлении / выходе из страницы.

Я бы предложил реализовать функцию деструктора.

deregisterListeners() {
    this.eventListeners.forEach(listener => {
        listener();
    });
    _.remove(this.eventListeners); //this is lodash,  it loops through all instances of w/e you're looping through
    clearInterval(this.intervalFunc);
}

Затем добавьте такие слушатели событий в ngOnInit

this.eventListeners.push(this.$scope.$on("$destroy", this.deregisterListeners.bind(this)));
this.intervalFunc = setInterval(() => {
     // your code / function that calls the data here
 });
person Joel    schedule 23.07.2018

Они блокируются, когда вы устанавливаете обновление каждые 3 секунды. 5 секунд оптимально, проверено: D

Во-первых, я хотел учиться без веб-сокетов, поэтому у меня вопрос, как это сделать лучше всего.

person Ziomek    schedule 23.07.2018
comment
Ответы не предназначены для добавления информации к вашему вопросу. Вам следует отредактировать исходный вопрос или добавить к нему комментарий. Вы, вероятно, еще не можете комментировать, поэтому вам следует отредактировать OP. - person Dorus; 23.07.2018