내가 PDF 파일을 검색하는 코너 2의 HTTP POST 메서드를 호출하려고 해요 변환, 그래서 나는 다음과 같이 물방울이 될하기 위해 ResponseContentType을 설정하고 있습니다 :Angular2/Rxjs HTTP 캐치 비동기 문제
let headers = new Headers({
'Content-Type': 'application/json',
'ApplicationName': 'ControlEnroll',
'Accept': 'application/pdf'
});
let options = new RequestOptions({
headers: headers,
responseType: ResponseContentType.Blob
});
이제는 post()
호출이 성공했을 때 아무런 문제가 없지만 오류 인 경우 Blob에서 래핑 되었기 때문에 WebAPI 메소드에서 반환 된 오류 메시지를 추출하는 데 문제가 있습니다. 이 2 각도 때문에
, 내 post()
전화와 구조는 지금이 바로 다음과 같습니다
catch()
방법에
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?
});
나는 제공되는 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
외부에 어떤 종류의 오류가 있습니다. Observable, 맞습니까? 이 catch()
메서드를 Blob에서 문자열을 가져올 수있는 방법으로 처리하려면 어떻게해야합니까? 그렇다면 다른 사람이이 전체 메서드를 구독하고 일반 subscribe(successFn, errorFn)
구조를 사용할 수 있도록 허용할까요? 가능한가?
대단히 감사합니다! 람다 조항의 예제 스 니펫 아래에 중괄호 {} 세트가 필요하다고 생각합니다. 단도가 없으면 내 끝에서 작동하지 않을 것이지만, 그렇지 않은 경우 정확하게 놓친 것이 었습니다. Observables가 Observable로 이벤트를 변환하기위한'fromEvent' 래퍼를 가지고 있다는 것을 알지 못했고,'throw'가 나중에 처리 할 수있게하는'do' 메소드가 있습니다. 나는 Promises에 오랜 시간을 보낸 후에도 Observable의 견해를 계속 얻고 있지만 이것은 훌륭했습니다. 다시 한번 감사드립니다. – Londovir
걱정할 필요가 없습니다. '{} '을 추가했습니다. – cartant
사실,'error'에'blob' 메서드가 있는지 확인해야합니다. 연결이없는 경우 예를 들어, 응답하지 않은 오류가 발생하면 놀라지 않을 것입니다. 어떤 경우에는받은 오류 등을 다시 던지기를 원할 수 있습니다. – cartant