繁体   English   中英

从订阅中获得可观察性

[英]get observable from a subscription

在做了一些实验之后,我发布了没有更改的代码,以找到最佳实践:我有一个函数(在服务中)将结果订阅为 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 也返回一个 observable,指示保存操作是否成功。 当前,正在从组件执行对该函数的调用:

this.<service name>.printAsPDF();

我希望该组件函数订阅 observable 并检查保存是否成功。 考虑到调用 printAsPDF 应该得到一个 observable(true) 取决于 FileSaver.saveAs(result, ) 是否被调用,我该怎么做

更改您对mapsubscribe (当然,您需要在组件中订阅才能使可观察对象变热)。 您可以将错误处理程序移动到您的组件或将其放入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);
}));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM