ember:承诺调用服务方法的控制器操作
ember: promise for a controller action that calls a service method
我的控制器上有一个调用服务方法的操作。服务方法是一个ember-数据查询。我需要 return 包含在 ember 数据负载中的消息返回控制器(将其打印到屏幕)。
我很难弄清楚如何让控制器动作(功能)达到 "wait" 以便服务方法完成。
控制器动作:
// 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.RSVP.Promise()是你想要的吗?
// 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);
});
}
您的服务方法应该return一个承诺。然后你可以这样使用它:this.get('cart').process().then((response) => {/*your code working with service's response*/});
您还应注意,如果您使用 ember 数据,它将 return 一个模型实例,而不是来自后端的原始响应。
并且,为了 return 承诺,您需要将服务的方法包装在 new Promise((resolve, reject) => {/*asynchronous code here*/});
中
我的控制器上有一个调用服务方法的操作。服务方法是一个ember-数据查询。我需要 return 包含在 ember 数据负载中的消息返回控制器(将其打印到屏幕)。
我很难弄清楚如何让控制器动作(功能)达到 "wait" 以便服务方法完成。
控制器动作:
// 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.RSVP.Promise()是你想要的吗?
// 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);
});
}
您的服务方法应该return一个承诺。然后你可以这样使用它:this.get('cart').process().then((response) => {/*your code working with service's response*/});
您还应注意,如果您使用 ember 数据,它将 return 一个模型实例,而不是来自后端的原始响应。
并且,为了 return 承诺,您需要将服务的方法包装在 new Promise((resolve, reject) => {/*asynchronous code here*/});