您好我对如何在Ember中使用承诺表示怀疑。基本上我想在运行下一个promise之前设置我的控制器的属性,我的代码:
export default Ember.Controller.extend({
min: null,
max: null,
isValid: Ember.computed(function(){
var self = this;
var result = new Ember.RSVP.Promise(function(resolve, reject){
var url = "..."
Ember.$.getJSON(url).then(function(data){
if (data[0] === 0){
self.set('errorMessage', "It is a free book");
return false;
} else if (data[0] > 2000){
self.set('errorMessage', "You are poor, go for next");
return false;
} else {
console.log(data); # line 2 of console result
self.set('min', data[1]);
self.set('max', data[2]);
return true;
}
});
});
}
return result;
}),
actions: {
save: function(){
if (this.get('isValid')){
console.log('save action is fired. -- VALID' + '--' + this.get('maxPrice')); # line 1 of console result
} else {
console.log('save action is fired. -- INVALID');
}
}
}
});
事情是在第三个if语句中,保存操作中的代码在promise中设置属性min和max之前运行。控制台中的结果:
> save action is fired. -- VALID--null
> [9, 1, 20]
知道如何在行动开始之前设置值吗?
谢谢,
答案 0 :(得分:1)
用另一个承诺包装jquery承诺没有多大意义。只需使用jquery promise,返回它,然后因为这是一个异步世界,你需要then
的承诺。
export default Ember.Controller.extend({
min: null,
max: null,
checkValid: function(url) {
var self = this;
return Ember.$.getJSON(url).then(function(data) {
if (data[0] === 0) {
self.set('errorMessage', "It is a free book");
return false;
} else if (data[0] > 2000) {
self.set('errorMessage', "You are poor, go for next");
return false;
} else {
console.log(data);#
line 2 of console result
self.set('min', data[1]);
self.set('max', data[2]);
return true;
}
});
},
actions: {
save: function() {
var self = this;
var url = ...;
this.checkValid(url).then(function(result) {
if (result) {
console.log('save action is fired. -- VALID' + '--' + self.get('maxPrice'));
} else {
console.log('save action is fired. -- INVALID');
}
});
}
}
});
此外,当您使用RSVP承诺时,您需要实际调用resolve
/ reject
来承诺永远解决或拒绝。以下是有关如何使用RSVP承诺的快速视频:https://www.youtube.com/watch?v=8WXgm4_V85E