【问题标题】:get observable from a subscription从订阅中可观察到
【发布时间】:2018-05-31 14:20:27
【问题描述】:

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

this.<service name>.printAsPDF();

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

【问题讨论】:

  • FileSaver.saveAs() 异步吗?如果是这样,它会使用Promise 甚至Observable 之类的东西吗?还有你用的是什么版本的 RxJS?

标签: angular observable observer-pattern subscribe


【解决方案1】:

将您的 subscribe 更改为 map(当然,您需要订阅您的组件以使 observable 变热)。您可以将错误处理程序移动到您的组件或将其放入 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);
}));

【讨论】:

  • 您可能应该以 RxJS 5.5+ 可管道操作符的形式展示这一点,同时符合当前 Angular 文档和使用 @angular/cli 等工具的 RxJS 版本。
  • @AlexanderStaroselsky 我感觉我要学习一些东西了......因为我不知道你在说什么:)。如果您只想编辑我的答案,那很好,或者我会在查找后修复它。
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多