Отклонить обещание в блоке 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() делает.

Другие вопросы по тегам