在继续之前在promise中设置controller属性

时间:2015-03-23 11:55:49

标签: ember.js ember-cli

您好我对如何在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]

知道如何在行动开始之前设置值吗?

谢谢,

1 个答案:

答案 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