J'ai un service qui récupère les données des points de terminaison:
Service.ts
protected parseProductDetails( data: any ): Object { let parsed: any = data; try { parsed.dimensions = JSON.parse( data.dimensions ); } catch( e ) { parsed.dimensions = []; } if( data.price ) parsed.priceFormatted = this.formatPrice( data.price, data.currency ); else parsed.priceFormatted = false; if( data.delivery ) parsed.deliveryFormatted = this.formatPrice( data.delivery, data.currency ); else parsed.deliveryFormatted = false; if( data.stock ) parsed.stockFormatted = this.formatStock( data.stock, data.stockUnit ); else parsed.stockFormatted = false; return parsed; }
console.log (data) - donne tous les produits. Tout va bien dans le service.Et la fonction this.parseProductDetails renvoie également tous les produits normalement.
Mais quand j'appelle depuis le composant:
ionViwDidLoad(){ this.productProvider.getAllProducts() .then( () => { items => this.items = items; console.log('All products', this.items) } ) .catch( err => console.debug( 'products not found', err ) ) }
console .log ('Tous les produits', this.items)
- rien dans le journal de la console n'est renvoyé, même pas le texte indéfini ou Tous les produits.
Quel est le problème avec ce code et ce que je dois changer que je pourrais récupérer des informations dans le composant?
parseProductDetails (item):
getAllProducts(){ return new Promise( (resolve, reject) => { this.apiService.get( this.allProducts, `/products`, {} ) .then( data => resolve( data.map( item => this.parseProductDetails( item ) ) ) ) .catch( err => reject( err ) ); } ); }
return analysé donne un tableau.
3 Réponses :
les numéros promis puis rappel:
this.productProvider.getAllProducts() .then((items) => { console.log('All products', items) } ) .catch( err => console.debug( 'products not found', err ) ) .then( () => loading.dismiss() );
Toujours rien dans console.log
essayez console.log (data.map (item => this.parseProductDetails (item))
Je pense que les données cartographiques renvoient une valeur vide @ AndrėjusLazauskas
Vous utilisez deux fonctions fléchées dans puis ()
. vous devez en supprimer un.
ionViwDidLoad(){ this.productProvider.getAllProducts() .then( (items) => { this.items = items; console.log('All products', this.items) }) .catch( err => console.debug( 'products not found', err ) ) .then( () => loading.dismiss() ); }
Supprimé, n'a pas aidé. Je l'ai copié dans mon premier alors (), et le chargement ne rejette jamais.
Il semble y avoir beaucoup de problèmes ici. Je ne sais pas quelle est la cause exacte, mais je suppose que le paramètre items
n'est pas placé correctement. Essayez ceci:
ionViwDidLoad(){ this.productProvider.getAllProducts() .then((items) => { this.items = items; console.log('All products', this.items) }) .catch((err) => console.debug( 'products not found', err )) .then(() => loading.dismiss()); }
Ce que vous appelez comme:
getAllProducts() { return this.apiService.get(this.allProducts, `/products`, {}).then((data) => { console.log('items', data); return data.map((item) => this.parseProductDetails(item)) }); }
J'ai essayé votre variante, toujours rien dans console.log - si elle ne va pas à bien des égards, quel serait le bon moyen d'appeler http promise et de le récupérer?
@ AndrėjusLazauskas la façon dont je l'ai écrit fonctionne. Bien que vous puissiez examiner les flux observables en combinaison avec le tube async
. N'utilisez pas de promesses imbriquées :)
@ AndrėjusLazauskas que contient exactement le console.log
? Null, undefined ou un tableau vide?
Ce n'est rien - rien dans la console. On dirait que cette fonction n'a tout simplement pas démarré après.
donc le this.apiService.get
ne semble pas être correct. Pouvez-vous ajouter cette implémentation à votre question?
Cela fonctionne correctement, j'ai ma baie en réponse réseau.
@ AndrėjusLazauskas encore, pour être complet, pouvez-vous l'ajouter? Mais le loading.dismiss ()
est-il appelé? Ensuite, on a l'impression qu'il entre dans l'instruction catch
. Mais les produits non trouvés
ne sont pas enregistrés?
Que dois-je ajouter exactement à ma question - parce que je ne sais pas vraiment ce qui ne va pas dans mon appel API?
L'autre chose est que lorsque j'échange la capture avec alors - j'obtiens "Tous les produits" indéfini.
peut-être que console.debug
ne fonctionne pas pour vous d'une manière ou d'une autre, pouvez-vous changer cela en console.error
, peut-être qu'une erreur plus claire apparaîtra. Si cela ne fonctionne pas, pouvez-vous montrer l'implémentation de this.parseProductDetails
fonction ajoutée à ma question.
@ AndrėjusLazauskas très difficile de dire ce qui ne va pas, il semble qu'une erreur soit avalée quelque part. Pouvez-vous néanmoins publier l'implémentation de this.apiService.get
?
Je n'ai pas cette fonction son de aws amplifier. Les autres points de terminaison fonctionnent normalement, mais celui-ci fonctionne bizarrement.
J'ai ajouté un console.log
dans getAllProducts. Pouvez-vous vérifier s'il y parvient? et s'il contient des données \
et Il renvoie un tableau d'articles comme je l'ai déjà dit.
Essayez de déplacer la fonction
loading.dismiss ()
dans votre premierpuis
et supprimez la seconde.then (() => loading.dismiss ()) code>.
Avez-vous une raison d'utiliser Promise sur Observable? Vous pouvez utiliser Observables comme réponse des services, puis utiliser toPromise () et l'utiliser comme Promise. Vous avez donc quelque chose comme this.productProvider.getAllProducts (). ToPromise (). Then (...).
Alors le licenciement n'arrive jamais.
Et Promise vs Observable - il n'y a rien de mal à utiliser Promise spécialement si je n'ai besoin que de récupérer des informations.