从订阅中获得可观察性

get observable from a subscription

在做了一些实验后,我 post 未经我修改的代码,以找到最佳实践: 我有一个函数(在服务中)以 BLOB 形式订阅结果并将其作为文件内容保存到本地文件系统 - FileSaver.saveAs(result, );:

printAsPDF()
{
   if (<some validator fails>)
   {
      return;
   } 
   let htmlContent = "<html><body>" + <some html content> +"</body></html>";
   //this.GetByteArrayForPDF returns Observable<any> (actually observable of a blob)
   this.GetByteArrayForPDF(htmlContent).subscribe(result => 
   {
      FileSaver.saveAs(result, <file name>); 
   }, error => console.log(error));
}

现在,我希望函数 printAsPDF return 也是一个指示保存操作是否成功的可观察对象。 目前,正在从组件执行对该函数的调用:

this.<service name>.printAsPDF();

我希望组件函数订阅可观察对象并检查保存是否成功。 考虑到对 printAsPDF 的调用应该得到一个 observable(true),这取决于是否调用了 FileSaver.saveAs(result, )

,我该怎么做

将您的 subscribe 更改为 map(当然,您需要在您的组件中订阅才能使可观察对象成为热点)。您可以将错误处理程序移动到您的组件或将其放在 catch 方法中。

return this.GetByteArrayForPDF(htmlContent)
.map(result => 
{
   FileSaver.saveAs(result, <file name>); 
   return true;
})
.catch(error => { 
    console.log(error);
    return Observable.of(false);
});

或使用管道运算符(RxJS 5.5+):

import { catchError, map } from 'rxjs/operators';

return this.GetByteArrayForPDF(htmlContent).pipe(
map(result => 
{
   FileSaver.saveAs(result, <file name>); 
   return true;
}),
catchError(error => { 
    console.log(error);
    return Observable.of(false);
}));