我正在通过多个服务调用进行级联删除。某些更高版本的订阅依赖先前的订阅来完成。如何保证下一个代码之前订阅已完成?
// Need to make sure this code completes
data.forEach(element => {
this.myService.delete(element.id).subscribe();
});
// Before running this code
this.myService.getAll().subscribe(res => {
res.data.forEach(element => {
this.myService.delete(element.id).subscribe();
});
}
);
答案 0 :(得分:1)
Subscription
有一个独特的用途:处分,但您可以选择:
如果您要一个接一个地订阅观察物,可以使用concat
。
如果您想同时订阅多个可观察对象并合并每个对象的最后一个值,则可以使用forkJoin
。
如果要在另一个可观测值中使用一个观测值的屈服值,则可以使用flatMap
。
import { forkJoin, interval, concat, of } from "rxjs";
import { first, flatMap } from "rxjs/operators";
var combinedIntervals =
forkJoin(
interval(1000).pipe(first()),
interval(2500).pipe(first())
).pipe(
flatMap(([a, b]) => of(`${a} and ${b}`))
);
concat(
combinedIntervals,
of("after both intervals")
)
.subscribe(
console.log.bind(console)
);
// 0 and 0
// after both intervals
对于您的特定情况,您将选择删除操作作为可观察对象,然后forkJoin加入它们。
var data = [];
var obsBatch1 = data.map(element => myService.delete(element.id));
var obsBatch2 =
forkJoin(
obsBatch1,
elements => elements.map(
element => myService.delete(element.id)
)
);
obsBatch2.subscribe();
这是rxjs@6
语法。我将rxjs@5
留作练习。