拒绝 http.get catch 块中的承诺

Reject a promise within an http.get catch block

我有一个在 promise 中使用 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));
    });
};

而不是在 catch 块中调用 this._handleError,我想拒绝我的承诺并传递 reject 错误对象。我该怎么做?

尝试:

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

我正在使用打字稿

Promise 作为 http 结果比 observable 更适合,所以我建议你采用 promise 方式:

private _getSchema(fileName): any {
    return this.http.get(fileName).toPromise().then(x => this._extractData(x));
};

您尝试的方法无效,因为 Observable.prototype.catch 具有不同的签名(它需要提供一个新的 observable 才能继续)。订阅 onError 就是你要找的:

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

但这正是 observable.toPromise() 所做的。