2017-01-19 9 views
0

약속 내에 http.get을 사용하는 비동기 함수가 있습니다.http.get catch 블록 내에서 약속을 거부합니다.

private _getSchema(fileName): any { 
    return new Promise((resolve, reject) => { 
     this.http.get(fileName) 
      .map(this._extractData) 
      .catch(this._handleError) 
      .subscribe(schema => resolve(schema)); 
    }); 
}; 

오히려 catch 블록에서 호출 this._handleError보다 내 약속을 거부하고 오류 개체를 거부 통과하고 싶습니다. 어떻게해야합니까?

는 시도 : 나는 타이프 라이터에게

+0

그냥'.catch (거부)'작업을 수행합니까? – dandavis

답변

2

약속을 사용하고

Argument of type '(err: any) => void' is not assignable to parameter of type '(err: any, caught: Observable) => ObservableInput<{}>'. Type 'void' is not assignable to type 'ObservableInput<{}>'.

HTTP와 같은 더 잘 맞는 관찰 가능한보다는 결과, 그래서 당신이 약속의 길을 갈 것이 좋습니다 :

private _getSchema(fileName): any { 
    return new Promise((resolve, reject) => { 
     this.http.get(fileName) 
      .map(this._extractData) 
      .catch(err => reject(err)) 
      .subscribe(schema => resolve(schema)); 
    }); 
}; 

오류가 있습니다 :

private _getSchema(fileName): any { 
    return this.http.get(fileName).toPromise().then(x => this._extractData(x)); 
}; 

Observable.prototype.catch이 다른 서명을 가지고 있기 때문에 시도한 방식이 작동하지 않습니다 (계속 진행하려면 새로운 관찰 가능 정보를 제공해야합니다).

private _getSchema(fileName): any { 
    return new Promise((resolve, reject) => { 
     this.http.get(fileName) 
      .map(this._extractData) 
      .subscribe(resolve, reject); 
    }); 
}; 

을하지만이 observable.toPromise()이 바로 이러한 작업을 수행하는 것입니다 :의 OnError 구독하면 검색 한 것입니다.

+0

우아합니다. 오류 처리를 어떻게 추가합니까? .then (x => {this._extractData (x)}, err => {/ * 오류 처리 * /}); – BeniaminoBaggins

+0

그건 방법이에요. 또는 .then (x => this._extractData (x)). catch (err => this._handleError (err))'. 하지만 여기에 오류 처리 기능을 추가하는 이유는 무엇입니까? –

+0

나는 그것을 묻지 않았다. 나는 그것을 어떻게 추가 할 수 있을지 질문했다. (거부를 사용하면 나중에 처리 할 때 오류가 반환 될 것이다.) 따라서 응답의 코드 블록이 가장 좋다. – BeniaminoBaggins