2017-01-19 60 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