Несколько последовательных AJAX запросов RXJS - PullRequest
2 голосов
/ 03 мая 2020

Я пытаюсь сделать несколько запросов AJAX последовательно с некоторой задержкой в ​​каждом запросе. Я ожидал бы последовательный ответ от каждого запроса. Я пытался mergeMap rx js оператор. Это работает хорошо, но я хочу получить ответ с некоторой задержкой. В настоящее время я получаю ответ на каждый запрос последовательно, но мне нужна некоторая задержка в каждом ответе.

import { of, from, interval } from 'rxjs'; 
import { map, mergeMap } from 'rxjs/operators';
import { ajax } from 'rxjs/ajax';

const items = [1,2,3,4,5];

const requests = from(items)
    .pipe(
      mergeMap(item => ajax.getJSON(`https://api.github.com/users/${item}`)),  
);
 requests.subscribe(
      data => console.log(data), //process item or push it to array 
      err => console.log(err)
);

Вот пример стекаблиза.

Множественный AJAX запрос RX JS

Ответы [ 3 ]

2 голосов
/ 03 мая 2020

Это можно сделать с помощью оператора delay .

Но сначала вам нужно будет использовать concatMap для каждого элемента в массиве элементов observable, так что для каждого элемента массива items создается новая наблюдаемая со временем задержки.

const items = [1,2,3,4,5];

const requests = from(items)
    .pipe(
      concatMap(item => ajax.getJSON(`https://api.github.com/users/${item}`)
        .pipe(
           delay(1000),
        )
    ),  
);
 requests.subscribe(
      data => console.log(data), //process item or push it to array 
      err => console.log(err)
);

Я разбудил новую демонстрацию над здесь .

0 голосов
/ 03 мая 2020

Попробуйте этот код с delay:)

const items = [1,2,3,4,5];

const requests = from(items)
    .pipe(
        mergeMap(item => ajax.getJSON(`https://api.github.com/users/${item}`)),
        // delay each element by 1 sec
        concatMap(x => of(x).pipe(delay(1000)))
      );

 requests.subscribe(
      data => console.log(data), //process item or push it to array 
      err => console.log(err)
);

Аналогичный случай здесь:

Задержка для каждого элемента с RX JS

Подробнее о задержке:

https://www.learnrxjs.io/learn-rxjs/operators/utility/delay

0 голосов
/ 03 мая 2020
from(items)

создаст «холодную наблюдаемую», что означает, что весь массив будет запущен немедленно. Если вы хотите добавить задержку перед отправкой запроса (не отправлять запросы сразу), попробуйте использовать zip и интервал

import { interval, zip } from 'rxjs';
import { flatMap } from 'rxjs/operators';
const interval$ = interval(1000);
const requests$ = zip(from(items), interval$)
  .pipe(
    flatMap(([itmes]) => items),
    mergeMap(item => ajax.getJSON(`https://api.github.com/users/${item}`))
)
...