如何订阅一个数组中的多个 Observable,但一次订阅一个?
How to subscribe several Observables in an array but one at a time?
我有一个数组中的任务列表,我需要 运行 它们调用 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...');
});
有什么想法吗?
编辑 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');
});
你可以使用 concat
,再加上一个数组缩减器:
obs$
.reduce((acc, curr) => acc.pipe(concat(curr)), of(undefined))
.subscribe(result => console.log(result));
您甚至可以使用创建者 concat
而不是操作员:
concat(...obs$)
.subscribe(res => console.log(res));
我有一个数组中的任务列表,我需要 运行 它们调用 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...');
});
有什么想法吗?
编辑 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');
});
你可以使用 concat
,再加上一个数组缩减器:
obs$
.reduce((acc, curr) => acc.pipe(concat(curr)), of(undefined))
.subscribe(result => console.log(result));
您甚至可以使用创建者 concat
而不是操作员:
concat(...obs$)
.subscribe(res => console.log(res));