【问题标题】:ember: promise for a controller action that calls a service methodember:对调用服务方法的控制器操作的承诺
【发布时间】:2017-06-12 19:05:33
【问题描述】:

我的控制器上有一个调用服务方法的操作。服务方法是 ember-data 查询。我需要将该 ember-data 有效负载中包含的消息返回给控制器(将其打印到屏幕上)。

我很难弄清楚如何让控制器操作(函数)“等待”服务方法完成。

控制器动作:

// 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
            }
        }
    });
},

我要等待响应的服务中的方法:

// 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');
        });
    });
},

promise 中的 'response' 为空,MessageObject 本身没有内容。所以我在这里做错了(这可能是对承诺的误解)。

我搞砸了 RSVP 承诺,也没有做得很好。我错过了什么,或者有更好的方法吗?

【问题讨论】:

    标签: ember.js promise ember-data


    【解决方案1】:

    您的服务方法应该返回一个承诺。然后你可以这样使用它:this.get('cart').process().then((response) => {/*your code working with service's response*/});

    您还应该知道,如果您使用 ember 数据,它将返回一个模型实例,而不是来自后端的原始响应。

    而且,为了返回承诺,您需要将服务的方法包装在new Promise((resolve, reject) => {/*asynchronous code here*/});

    【讨论】:

      【解决方案2】:

      我对@9​​87654321@ 做了类似的事情,这就是你想要的吗?

      // controller
      myMessage = null,
      actions:
      cartCoupon() {
        let msg = this.get('cart').processCoupon();
        msg.then(myDataMessage => this.set('myMessage', myDataMessage);
      }
      
      
      //service
      processCoupon() {
        return new Ember.RSVP.Promise( resolve => {
          let data = 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');
              });
          });
          resolve(data);
        });
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        相关资源
        最近更新 更多