2017-01-19 2 views
0

J'ai cette fonction asynchrone qui utilise http.get dans une promesse.Rejeter une promesse dans un bloc 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)); 
    }); 
}; 

Plutôt que this._handleError d'appel dans le bloc catch, je voudrais rejeter ma promesse et passer rejeter l'objet d'erreur. Comment je fais ça?

tentative:

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

donne erreur:

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

J'utilise tapuscrit

+0

fait juste '.catch (reject)' travail? – dandavis

Répondre

2

promesses correspondent mieux http résultats que observables, alors je vous suggère de suivre la voie de promesse :

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

La façon dont vous avez essayé ne fonctionne pas parce que Observable.prototype.catch a une signature différente (Il doit fournir une nouvelle observable pour continuer). Vous abonnant à onError est ce que vous recherchez:

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

Mais c'est exactement ce que observable.toPromise() fait.

+0

C'est élégant. Comment ajouter une gestion des erreurs? '.then (x => {this._extractData (x)}, err => {/ * erreur de gestion * /});'? – BeniaminoBaggins

+0

C'est un moyen. Ou '.then (x => this._extractData (x)). Catch (err => this._handleError (err))'. Mais pourquoi ajouteriez-vous la gestion des erreurs ici, vous venez de nous demander comment l'enlever? –

+0

Je n'ai pas demandé de l'enlever. J'ai demandé comment je peux l'ajouter (en utilisant le rejet, la promesse retournera l'erreur pour la manipuler plus tard.) Donc, votre bloc de code inférieur dans votre réponse serait le meilleur pour cela? – BeniaminoBaggins