【发布时间】:2017-04-01 20:03:16
【问题描述】:
我正在尝试在 Angular 2 中调用 HTTP Post 方法来检索 PDF 文件,因此我将 ResponseContentType 设置为 Blob,如下所示:
let headers = new Headers({
'Content-Type': 'application/json',
'ApplicationName': 'ControlEnroll',
'Accept': 'application/pdf'
});
let options = new RequestOptions({
headers: headers,
responseType: ResponseContentType.Blob
});
现在,post() 调用成功时我没有问题,但是当它是错误时,我在提取从我的 WebAPI 方法返回的错误消息时遇到问题,因为它被包装在一个 Blob 中。
由于这是 Angular 2,我的 post() 调用和结构现在看起来像这样:
return this.http.post(postUrl, {
// ... some body parameters here ...
}, options)
.map(resp => {
let blob: Blob = resp.blob();
// Use the file-save library to persist this to disk.
window['saveAs'](blob, 'File.pdf');
return resp;
}).catch(error => {
// What to do?
});
问题出在catch() 方法中,我知道提供的error 是一个包含Blob 主体的响应对象。我知道从 Blob 对象中提取文本的唯一方法是使用 FileReader 和事件侦听器,如下所示:
let body = error.json();
let reader = new FileReader();
reader.addEventListener('loadend', function () {
console.log(reader.result);
});
reader.readAsText(body);
但是,这不会立即发生;它是一个事件监听器。然而,catch() 必须 [likey] throw 是某种外部可观察到的错误,对吧?我如何处理这个catch() 方法,让我将字符串从Blob 中拉出,同时允许其他人订阅整个方法并使用正常的subscribe(successFn, errorFn) 结构?有可能吗?
【问题讨论】:
标签: angular try-catch rxjs angular2-observables