在继续执行下一个代码之前,确保可观察的订阅完成

时间:2018-06-26 16:16:24

标签: angular typescript rxjs observable

我正在通过多个服务调用进行级联删除。某些更高版本的订阅依赖先前的订阅来完成。如何保证下一个代码之前订阅已完成?

// 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();
        });
    }
);

1 个答案:

答案 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留作练习。