Angular2/Rxjs HTTP 捕获异步转换问题
Angular2/Rxjs HTTP Catch Asynchronous Transform Issue
我正在尝试调用 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 主体的 Response 对象。据我所知,从 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)
结构?可能吗?
传递给 catch
运算符的选择器函数可以 return 一个可观察对象,用于在发生错误时继续可观察链。
因此您的选择器函数可以 return 等待来自 FileReader
的 loadend
事件的可观察对象,然后使用您从 BLOB 读取的消息抛出错误。像这样:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/do';
...
.catch(error => {
let reader = new FileReader();
let loadend = Observable.fromEvent(reader, 'loadend');
reader.readAsText(error.blob());
return loadend.do(() => { throw new Error(reader.result /* or whatever */); });
})
我正在尝试调用 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 主体的 Response 对象。据我所知,从 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)
结构?可能吗?
传递给 catch
运算符的选择器函数可以 return 一个可观察对象,用于在发生错误时继续可观察链。
因此您的选择器函数可以 return 等待来自 FileReader
的 loadend
事件的可观察对象,然后使用您从 BLOB 读取的消息抛出错误。像这样:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/do';
...
.catch(error => {
let reader = new FileReader();
let loadend = Observable.fromEvent(reader, 'loadend');
reader.readAsText(error.blob());
return loadend.do(() => { throw new Error(reader.result /* or whatever */); });
})