2017-04-01 8 views
1

내가 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) 구조를 사용할 수 있도록 허용할까요? 가능한가?

답변

0

catch 연산자에 전달 된 selector 함수는 오류가 발생했을 때 관찰 가능 체인을 계속하기 위해 사용되는 observable을 반환 할 수 있습니다.

따라서 선택기 기능은 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 */); }); 
}) 
+1

대단히 감사합니다! 람다 조항의 예제 스 니펫 아래에 중괄호 {} 세트가 필요하다고 생각합니다. 단도가 없으면 내 끝에서 작동하지 않을 것이지만, 그렇지 않은 경우 정확하게 놓친 것이 었습니다. Observables가 Observable로 이벤트를 변환하기위한'fromEvent' 래퍼를 가지고 있다는 것을 알지 못했고,'throw'가 나중에 처리 할 수있게하는'do' 메소드가 있습니다. 나는 Promises에 오랜 시간을 보낸 후에도 Observable의 견해를 계속 얻고 있지만 이것은 훌륭했습니다. 다시 한번 감사드립니다. – Londovir

+0

걱정할 필요가 없습니다. '{} '을 추가했습니다. – cartant

+1

사실,'error'에'blob' 메서드가 있는지 확인해야합니다. 연결이없는 경우 예를 들어, 응답하지 않은 오류가 발생하면 놀라지 않을 것입니다. 어떤 경우에는받은 오류 등을 다시 던지기를 원할 수 있습니다. – cartant