Вызовите Observable.subscribe () в последовательности - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть массив объектов, и я хочу l oop над массивом и вызывать службу для каждого элемента, НО для каждого элемента, я хочу вызывать следующий элемент только тогда, когда текущий Вызов выполнен с успехом, если не заблокировать остальных.

    onUpload(items: MyItem[]) {
      items.forEach(i => {
        myService.doSomething(i).subscribe(response => {
          // do something with the success item i
          // do the next call for the next item 
        }, error => {
          // handle the error
        })
      })

     }

Можно ли вызывать Observables в режиме последовательности не параллельно?

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020

Используйте from для выдачи значений из массива, а затем от contactMap до последовательно выполняйте наблюдаемые

import { from } from 'rxjs';
import { concatMap } from 'rxjs/operators';

onUpload(items: MyItem[]) {
  from(items)
    .pipe(
       concatMap(item => myService.doSomething(i))
    )
    .subscribe(response => {/* do something with response */});
}
0 голосов
/ 30 апреля 2020

Я думаю, что это будет более изящно

onUpload(items: MyItem[]) {
  from(items)
  .pipe(mergeMap((item) => myService.doSomething(item)))
  .subscribe(
    () => console.log(finish),
    (err) => console.log('error happens', err),
  );
}
0 голосов
/ 30 апреля 2020

Используйте concat из rxjs. Документация здесь https://www.learnrxjs.io/learn-rxjs/operators/combination/concat.

Код выглядит так:

onUpload(items: MyItem[]) {
  const observableArray = items.map(i => myService.doSomething(i));
  concat(...observableArray).subscribe(
    () => { /* Some logic */ },
    (err) => { /* Some logic */ },
  );
}
...