Angular 从订阅中获取可观察信息

Angular 从订阅中获取可观察信息,angular,observable,observer-pattern,subscribe,Angular,Observable,Observer Pattern,Subscribe,在做了一些实验之后,我发布了没有修改的代码,以找到最佳实践: 我有一个函数(在服务中),它将结果订阅为BLOB,并将其作为文件内容保存到本地文件系统-FileSaver.saveAs(result,);: printAsPDF() { 如果() { 返回; } 让htmlContent=“+++”; //this.GetByteArrayForPDF返回可观察(blob的实际可观察) this.GetByteArrayForPDF(htmlContent).subscribe(结果=> { F

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

printAsPDF()
{
如果()
{
返回;
} 
让htmlContent=“+++”;
//this.GetByteArrayForPDF返回可观察(blob的实际可观察)
this.GetByteArrayForPDF(htmlContent).subscribe(结果=>
{
FileSaver.saveAs(结果,);
},error=>console.log(error));
}
现在,我希望函数printAsPDF也返回一个可观察值,它指示保存操作是否成功。 当前,正在从组件执行对该函数的调用:

this.<service name>.printAsPDF();
this..printAsPDF();
我希望组件函数订阅可观察对象,并检查保存是否成功。
如果调用FileSaver.saveAs(result,)的话,printAsPDF调用应该得到一个可观察的(true)值,那么我该怎么做呢?

将您的
订阅
更改为
映射(当然,您需要在组件中订阅才能使可观察的内容变热)。您可以将错误处理程序移动到组件中,或将其放入
catch
方法中

return this.GetByteArrayForPDF(htmlContent)
.map(result => 
{
   FileSaver.saveAs(result, <file name>); 
   return true;
})
.catch(error => { 
    console.log(error);
    return Observable.of(false);
});
返回此.GetByteArrayForPDF(htmlContent)
.map(结果=>
{
FileSaver.saveAs(结果,);
返回true;
})
.catch(错误=>{
console.log(错误);
可观察到的返回(错误);
});
或使用可管道操作器(RxJS 5.5+):

从'rxjs/operators'导入{catchError,map};
返回此.GetByteArrayForPDF(htmlContent).pipe(
映射(结果=>
{
FileSaver.saveAs(结果,);
返回true;
}),
catchError(错误=>{
console.log(错误);
可观察到的返回(错误);
}));

FileSaver.saveAs()
异步的吗?如果是这样,它是否利用了类似于
承诺
的东西,甚至是
可观察的
?另外,您使用的是什么版本的RxJS?您可能应该以RxJS 5.5+可管道操作符的形式展示这一点,并与当前的Angular文档和RxJS版本保持一致,这些RxJS版本使用的工具包括
@Angular/cli
@AlexanderStaroselsky。我感觉我即将学到一些东西。。。因为我不知道你在说什么:)。如果你只想编辑我的答案,那很好,否则我会在查找这些答案后修复它。
return this.GetByteArrayForPDF(htmlContent)
.map(result => 
{
   FileSaver.saveAs(result, <file name>); 
   return true;
})
.catch(error => { 
    console.log(error);
    return Observable.of(false);
});
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);
}));