2017-01-19 5 views
0

У меня есть эта асинхронная функция, которая использует http.get внутри обещания.Отклонить обещание в блоке catch http: 0get

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

Вместо 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 (reject)' work? – 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 => {/ * ошибка дескриптора * /});'? – BeniaminoBaggins

+0

Это путь. Или '. Then (x => this._extractData (x)). Catch (err => this._handleError (err))'. Но зачем вам добавлять обработку ошибок здесь, вы просто спросили нас, как ее удалить? –

+0

Я не просил снять его. Я спросил, как я могу добавить его (используя отказ, обещание вернет ошибку, чтобы обработать позже. Таким образом, ваш нижний блок кода в вашем ответе был бы лучшим для этого? – BeniaminoBaggins