2017-06-12 5 views
0

Ich habe eine Aktion auf meinem Controller, der eine Service-Methode aufruft. Die Servicemethode ist eine Glutendatenabfrage. Ich muss eine Nachricht, die in dieser Ember-Daten-Nutzlast enthalten ist, zurück an die Steuerung senden (sie auf den Bildschirm drucken).ember: Versprechen für eine Controller-Aktion, die eine Service-Methode ruft

Ich habe eine harte Zeit herauszufinden, wie die Controller-Aktion (Funktion) warten auf die Service-Methode zu beenden.

Die Controller Aktion:

// controller action 
processCoupon() { 
    // the service method I want to wait for the response for 
    let messageObject = DS.PromiseObject.create({ 
     promise: this.get('cart').processCoupon() 
    }); 

    // the message 
    messageObject.then(response => { 
     let promo_message = messageObject.get('promo_message'); 
     if (promo_message.message && promo_message.alert) { 
      if (!promo_message.success) { 
       // show error message in alert with ember-cli-notifcations 
      } else { 
       // show success message in alert with ember-cli-notifcations 
      } 
     } 
    }); 
}, 

Methode in dem Service, den ich für die Antwort warten will:

// service method syncs cart info (containing promo) with the backend 
// promo_message is in the response payload 
processCoupon() { 
    return this.get('store').findRecord('cart', get(this, 'cartObj.id')).then(cart => { 
     cart.save().then(newCart => { 
      set(this, 'cartObj', newCart); // sets response to property on service 
      return newCart.get('promo_message'); 
     }); 
    }); 
}, 

die 'Antwort' in der Verheißung ist leer, und die MessageObject selbst hat kein Inhalt. Also mache ich hier etwas falsch (und es ist wahrscheinlich Missverständnisse Versprechen).

Ich verwirrte mit RSVP Versprechungen und war auch nicht gut dort. Was vermisse ich, ODER gibt es einen besseren Weg, dies zu tun?

Antwort

1

Ihre Service-Methode sollte ein Versprechen abgeben. Dann können Sie es wie folgt verwenden: this.get('cart').process().then((response) => {/*your code working with service's response*/});

Sie sollten auch beachten, dass wenn Sie Ember-Daten verwenden, es eine Modellinstanz zurückgibt, keine ursprüngliche Antwort von Ihrem Back-End.

Und, um Versprechen zu liefern, müssen Sie Ihre Service-Methode in

umbrechen
Verwandte Themen