2017-06-21 5 views
1

Je ne peux pas comprendre pourquoi je ne peux pas attraper cette erreur:Ember: attraper ne fonctionne pas avec Ember-données erreur FindRecord

Assertion Failed: You made a 'findRecord' request for a 'cart' with id '3ea1901a-56a9-11e7-a8f4-60e147bfe84c', but the adapter's response did not have any data 

Ceci se produit lorsque vous essayez d'ajouter un élément à mon service de panier, mais il y a un problème avec l'API. Plus précisément, je suis en train de tester un scénario de sécurité dans lequel il existe une discordance de jeton avec l'API. L'API va renvoyer une réponse vide, ce qu'elle fait, mais je veux braquer catch cette erreur et déclencher une fonction addItemToNewCart.

Ceci est la méthode « ajouter »:

// cart methods 
add(item) { 

    let self = this; 

    // get cart from API first. if this fails (in catch clause) a new one should be created 
    return this.get('store').findRecord('cart', get(this, 'cartObj.id')).then(response => { 

     console.log("RESPONSE", response.get('cartitems')); 
     // check if cart already has lineitem 
     let existingLineItem = response.get('cartitems').findBy('skuid', item.skuid); 
     if (existingLineItem) { // if item is already in cart, just add more 
      console.log("line item in response, adding quantity"); 
      set(existingLineItem, 'quantity', parseInt(existingLineItem.quantity)+parseInt(item.quantity)) 
     } else { 
      console.log("line item not in response, adding new"); 
      response.get('cartitems').addObject(item); 
     } 
     // saving persists the cart back to API 
     response.save().then(newCart => { 
      set(this, 'cartObj', newCart); 
     }); 
    }).catch(e => { 
     // this is not firing even though there is an error 
     console.log("problem with findRecord - create a new cart and add item to it", e.message); 
     self._addItemToNewCart(item); 
    }); 

}, 

Il semble que la promesse d'une certaine manière, les données de Ember résout avec succès, car les messages CONSOLE.LOG je dans le bloc then sont en cours d'impression:

enter image description here

Je devine que findRecord cherche d'abord localement, trouver le chariot, l'exécution du bloc then et un async findRecord arrive plus tard avec une erreur de l'API (trop tard pour le bloc catch), peut-être?

Si tel est le cas, comment puis-je dire, « attendre une réponse de l'API avant de faire quoi que ce soit et si la réponse est vide, appelez _addItemToNewCart »?

+0

je ferais this.store.findRecord (...). Puis (réponse => {// retourne un nouvel objet si la réponse répond à la condition}); –

Répondre

0

trouvé la réponse here

Fondamentalement, besoin d'ajouter { reload: true } à la découverte des données Ember-requête

+0

En fait, votre sujet semble que vous voulez quelque chose de différent, et je vous encourage à en lire plus sur les api docs. cela aura plus d'informations détaillées que les guides. https://emberjs.com/api/ .. pour votre cas findRecord regardez https://emberjs.com/api/data/classes/DS.Store.html – kumkanillam