当一个RxJS可观察对象完成时,我如何执行异步代码?

当一个RxJS可观察对象完成时,我如何执行异步代码?,rxjs,rxjs6,Rxjs,Rxjs6,我希望在可观察的对象完成时执行代码。在我的代码中,我执行以下操作: compact():可观察{ 返回此.loadIndex()管道( mergeMap((index)=>index.walk()), 映射((条目)=>entry.manifest), notUndefined(), writeAllMessages(this.newPath、ProtoFileManifest), 完成(异步()=>{ 等待承诺([ rm(this.journalPath,{force:true}), rm(t

我希望在可观察的对象完成时执行代码。在我的代码中,我执行以下操作:

compact():可观察{
返回此.loadIndex()管道(
mergeMap((index)=>index.walk()),
映射((条目)=>entry.manifest),
notUndefined(),
writeAllMessages(this.newPath、ProtoFileManifest),
完成(异步()=>{
等待承诺([
rm(this.journalPath,{force:true}),
rm(this.manifestPath,{force:true}),
]);
等待承诺。重命名(this.newPath,this.manifestPath);
}),
);
}
问题是finalize方法是为同步代码设计的。当我像上面那样执行异步代码时,代码将独立于subscribe执行

我希望这将是执行时,处理资源的可观察的,但我希望,当我订阅,我总是收到事件

如何将异步代码放入finalize方法中

谢谢
Ulrich

一种方法是创建三个可观察对象,而不是尝试全部创建 在一个。每一个都将在您想要创建的顺序异步链中组成一个链接 制造

为了使基于承诺的观察中的副作用变得懒惰,我们使用了
defer
。 请注意,延迟回调的返回值可以是可观察的,也可以是 “ObservableInput”,RxJS称之为它知道如何转换的值 变成可观察的。这个值可以是(除其他外)一个承诺

({
compact():可观察的{
const writeToTempManifest$=this.loadIndex().pipe(
mergeMap((index)=>index.walk()),
映射((条目)=>entry.manifest),
notUndefined(),
writeAllMessages(this.newPath,ProtoFileManifest)
);
const removeOldManifest$=延迟(()=>
我保证([
rm(this.journalPath,{force:true}),
rm(this.manifestPath,{force:true}),
])
);
const renameNewManifest$=延迟(()=>
重命名(this.newPath,this.manifestPath)
);
归来([
writeToTempManifest$,
removeOldManifest$,
renameNewManifest$,
]).管道(concatAll());
},
});
请注意,这些观察值中的每一个都可能发出一些东西(尽管我不熟悉API)。第一个发出
writealMessages
操作符所做的任何操作,而第二个和第三个发出各自承诺的解析值。在第二个例子中,这是来自
Promise.all
的两元素数组

如果要抑制可观测对象的发射值,同时在其完成之前保持其打开状态,则可以创建一个运算符来执行此操作:

const silence=pipe(concatMapTo(空));

我建议将所有承诺转换为可观察的承诺。此外,
mergeMap
接受承诺,因此您可以将在
finalize
中使用的承诺放入一个
mergeMap
中。在完成另一个承诺后运行一个observate将是
concat*
的工作。