Отклонить обещание в блоке перехвата http.get

У меня есть асинхронная функция, которая использует 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, я хотел бы отклонить свое обещание и передать отклонение объекта ошибки. Как я могу это сделать?

пытаться:

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

Я использую машинописный текст


person BeniaminoBaggins    schedule 19.01.2017    source источник
comment
просто .catch(reject) работает?   -  person dandavis    schedule 19.01.2017


Ответы (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().

person Tamas Hegedus    schedule 19.01.2017
comment
Это элегантно. Как добавить обработку ошибок? .then(x => {this._extractData(x)}, err => {/*handle error*/});? - person BeniaminoBaggins; 19.01.2017
comment
Это способ. Или .then(x=>this._extractData(x)).catch(err => this._handleError(err)). Но зачем вам добавлять сюда обработку ошибок, вы только что спросили, как ее убрать? - person Tamas Hegedus; 19.01.2017
comment
Я не просил удалить его. Я спросил, как я могу добавить его (используя отклонение, обещание вернет ошибку для последующей обработки. Так что ваш нижний блок кода в вашем ответе будет лучше всего для этого? - person BeniaminoBaggins; 19.01.2017
comment
Да, в большинстве случаев .catch в конце - лучший вариант. Если вы хотите, чтобы получившееся обещание по-прежнему было отклонено, используйте: .catch(e => { this.handle(e); throw e; }) - person Tamas Hegedus; 19.01.2017