从订阅中获得可观察性
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);
}));
在做了一些实验后,我 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);
}));