我的软件中有几种情况,其中有一系列可观察的对象,需要按顺序执行它们。只有在上一个订阅完成后才能进行下一个订阅。
因此,我使用concat
运算符。它运作良好,但是每次Observables
之一完成时都会触发其订阅,因此我需要在一切完成后才触发它。
concat(
of(1, 2, 3).pipe(delay(3000)),
// after 3s, the first observable will complete and subsquent observable subscribed with values emitted
of(4, 5, 6).pipe(delay(3000)),
)
// log: 1,2,3,4,5,6
.subscribe((v) => {
// Needs to be triggered once after everything is complete
console.log(v);
});
我需要一种方法来传递此可观察的消息,以便在完成所有操作后仅触发一次订阅,在这种情况下,订阅的值并不重要,因此可以省略。
如果可能,可以在订阅上下文中以数组的形式提供值。
答案 0 :(得分:3)
如果不需要响应,请像在@Willem的解决方案中一样使用complete callback
。
否则,您可以将值收集到数组中。
import { toArray } from 'rxjs/operators';
concat(
of(1, 2, 3).pipe(delay(3000)),
of(4, 5, 6).pipe(delay(3000)),
).pipe(toArray())
.subscribe(v => console.log(v)); // log: [1,2,3,4,5,6]
答案 1 :(得分:2)
finalize()
:在可观察到的完成或错误时调用函数
请参见https://www.learnrxjs.io/operators/utility/finalize.html
complete
事件:.subscribe({
complete: () => { ... }
})
forkJoin()
,尤其是在您需要最终值的情况下:所有可观测值完成后,从每个可观测值中发出最后一个发出的值。
https://www.learnrxjs.io/operators/combination/forkjoin.html