Rx js для опроса, вызывающего несколько повторяющихся вызовов API - PullRequest
0 голосов
/ 26 февраля 2020

Опрашивать здесь означает - регулярно делать вызовы API через определенные промежутки времени после заданного времени ie refreshInterval и обновлять данные.

Я пытаюсь применить опрос (ie - вызов API основан на некоторых refreshInterval) но его повторяющиеся вызовы API, а также непрерывное выполнение 1000 вызовов API и ответ также не поступают.

Несколько вызовов происходят непрерывно, независимо от времени опроса. Он подписывается каждую секунду для каждого вызова API независимо от предоставленного времени опроса.

В чем здесь ошибка или как правильно это сделать?

.ts

ngOnInit(){
// loop for demonstration
 for(let j = 0; j < 5; j++){
   makeApiCall(refreshInterval, url, params, payload) //<=== looping based on some json
 }

}

public makeApiCall(refreshInterval, url, params, payload){
interval(refreshInterval * 1000)
      .pipe(
        startWith(0),
        flatMap(() => this.serviceInvoker.invoke(url, params, payload)),
      ).subscribe(
        (success) => {
        },
        (err) => {

   }
  )
}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

HTTP-вызов асинхронный. Таким образом, вы можете вызывать другой HTTP-вызов, пока предыдущий еще не завершен. Каждый браузер имеет определенный порог для одновременных подключений к хосту (например, Chrome - 6), выше которого все запросы HTTP будут удерживаться до тех пор, пока предыдущие запросы не возвратят ответ. Вот почему вы не получаете никакого ответа.

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

Для этого вы можете использовать setTimeout() внутри каждого обратного вызова для обходного решения вместо l oop. Но остерегайтесь, это идет с тяжелыми оговорками. После вызова функция повторяется непрерывно, если она не остановлена ​​на clearTimeout(timeoutId).

private timeoutId: any;

public makeApiCall(refreshInterval, url, params, payload) {
  this.serviceInvoker.invoke(url, params, payload).subscribe(
    (success) => {
      // handle success
      this.timeoutId = setTimeout(() => { this.makeApiCall(url, params, payload) }, refreshInterval * 1000);
    },
    (err) => { 
      // handle error 
      this.timeoutId = setTimeout(() => { this.makeApiCall(url, params, payload) }, refreshInterval * 1000);
    }
  );
}
0 голосов
/ 26 февраля 2020

Здесь

public makeApiCall(refreshInterval, url, params, payload) {
    interval(refreshInterval * 1000)
//...

Первый вызов makeApiCall имеет значение refreshInterval, равное 0. Вот фрагмент стека того, что происходит, когда вы пытаетесь что-то сделать с интервалом 0: https://stackblitz.com/edit/typescript-rrnu4d?file=index.ts

Вам нужно timer, а не interval. А еще лучше сделайте что-то вроде

interval(1000).pipe(
    take(5),
    flatMap(() => this.serviceInvoker.invoke( //...
...