2017-01-19 96 views
0

我有這個異步函數,它在promise中使用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相反,我想拒絕我的諾言,並通過拒絕錯誤對象。我怎麼做?

嘗試:

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

給出了錯誤:

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<{}>'.

我使用打字稿

+0

只是'.catch(拒絕)'工作? – dandavis

回答

2

承諾適合作爲HTTP更好的結果比觀測,所以我建議你去承諾方式:

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

您嘗試的方式不起作用,因爲Observable.prototype.catch具有不同的簽名(它需要提供一個新的可觀察項以繼續)。訂閱onError的是你正在尋找:

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

但這正是observable.toPromise()一樣。

+0

那很優雅。我如何添加錯誤處理? '.then(x => {this._extractData(x)},err => {/ * handle error * /});'? – BeniaminoBaggins

+0

這是一種方式。或者'.then(x => this._extractData(x))。catch(err => this._handleError(err))'。但是,爲什麼你要在這裏添加錯誤處理,你只是問我們如何刪除它? –

+0

我沒有要求將其刪除。我問過如何添加它(使用拒絕,承諾會返回錯誤以便稍後處理。因此,您的答案中的底部代碼塊最適合這種情況嗎? – BeniaminoBaggins