如何在一个数组中订阅多个Observable,但一次只能订阅一个?

fra*_*isk 0 typescript ionic3 angular rxjs6

我有一个数组中的任务列表,我需要运行它们来调用Web服务.

但问题是,它们在一个数组中,我需要一次运行一个,这意味着:只有在完成这一个时才运行下一个,无论是否发生错误.

我在这里使用了这个代码,我使用的是combineLatest,但是这样我只有在完成所有这些时才得到结果.

let arrayOfTasks: ServerTask[] = cacheInfo.cacheData;
let observables = [];
arrayOfTasks.forEach((task: ServerTask) => {
  if (task.method === 'post') {
    let observable$: any = this.restService.sendPost(task.action, task.payload, false, task.cacheName);
    observables.push(observable$);
  }
});

const combined = combineLatest(observables);
combined.subscribe((value: any[]) => {
  console.log('ARRAY DATA RETURNED');
  console.log(value);
}, error => {
  console.error(`Error running stored tasks: ${error}`);
}, () => {
  console.log('All cache tasks executed...');
});
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

编辑1:

正如@trichetriche所说,这是最终的解决方案:

concat(...observables).subscribe((result: any) => {
  console.log('RESULT: ', result);
}, error => {
  console.error(`Error running queue of tasks: ${error}`)
}, () => {
  console.log('All subscriptions executed');
});
Run Code Online (Sandbox Code Playgroud)

小智 6

你可以使用concat它,加上一个数组reducer:

obs$
  .reduce((acc, curr) => acc.pipe(concat(curr)), of(undefined))
  .subscribe(result => console.log(result));
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用创建者concat而不是运算符:

concat(...obs$)
  .subscribe(res => console.log(res));
Run Code Online (Sandbox Code Playgroud)

工作stackblitz