Как заставить observable работать параллельно и возвращать каждое обещание по мере их разрешения? - PullRequest
0 голосов
/ 17 июня 2020

Например, у меня есть наблюдаемое из массива обещаний. Теперь я хочу, чтобы обещания выполнялись параллельно. Затем я хочу, чтобы наблюдаемый объект начал испускать значения, как только обещание разрешится. Это означает, что порядок значений НЕ важен.

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Я бы использовал mergeMap в этом случае.

Например, если у вас есть массив строк, представляющих URL-адреса конечных точек REST, вы можете сделать что-то вроде этого

const arrayOfUrls = [
  'https://my_service/myendpoint_1',
  'https://my_service/myendpoint_2',
  'https://my_service/myendpoint_3',
];

from(arrayOfUrls) // this creates a stream strings emitting each endpoint url
.pipe(
  mergeMap(url => fetch(url))  // mergeMap creates a stream of the results of each REST call
)
.subscribe(
  next: result => console.log('result of REST call', result)
)
0 голосов
/ 17 июня 2020

Вы можете создать по одному Observable для каждого обещания, а затем объединить их все.

Вот один из способов сделать это:

promises = [
 fetch('http://slowwly.robertomurray.co.uk/delay/6000/url/https://jsonplaceholder.typicode.com/todos/1'),
 fetch('https://jsonplaceholder.typicode.com/todos/1'),    
 fetch('http://slowwly.robertomurray.co.uk/delay/3000/url/https://jsonplaceholder.typicode.com/todos/2')
 ]

 promises.reduce((acc, promise) => 
   rxjs.merge(acc, rxjs.from(promise)), rxjs.empty()
 ).subscribe(console.log)

Это будет отличаться от forkJoin, который возвращает только когда все они вышли:

rxjs.forkJoin(promises.map(promise => rxjs.from(promise))).subscribe(console.log)
...