Отклонить обещание в блоке http.get catch
У меня есть эта асинхронная функция, которая использует http.get внутри обещания.
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 в блоке catch, я бы хотел отклонить свое обещание, а pass отклонить объект error. Как я могу это сделать?
попытка:
private _getSchema(fileName): any {
return new Promise((resolve, reject) => {
this.http.get(fileName)
.map(this._extractData)
.catch(err => reject(err))
.subscribe(schema => resolve(schema));
});
};
выдает ошибку:
Аргумент типа '(err: any) => void' не может быть присвоен параметру типа '(err: any, catch: Observable) => ObservableInput<{}>'. Тип 'void' нельзя назначить типу 'ObservableInput<{}>'.
Я использую машинопись
1 ответ
Обещания лучше соответствуют результатам 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()
делает.