使Ember函数从回调中返回一个承诺

时间:2013-12-10 00:32:34

标签: javascript ember.js promise

我希望函数返回来自model.save()的承诺,但是对model.save()的调用是在回调中,因此不会使其成为链。这就是我的意思:

function saveOn (target, attribute) {
    target.addObserver(attribute, function () {
        if (target.get(attribute)) {
            target.removeObserver(attribute);
            Ember.run.once(target, function() {
                target.save();
            });
        }
    });
};

(此功能是解决this problem I previously posted

所必需的

我希望target.save();行改为:return target.save();

然后我可以这样做:

saveOn().then();

现在不起作用,错误消息只是then在该对象上不存在。

更新

teacherSignUp: function() {
    var model = this.get('model');
    var teacher = this.get('store').createRecord('teacher', {
        description: 'Why hello sir',
        user: model
    });
    model.set('teacher', teacher);
    saveOn(teacher, 'user.isFulfilled').then(function() {
        console.log("Model");
        saveOn(model, 'teacher.isFulfilled');
    });
}

成功调用console.log("Model");,但模型永远不会保留。 这里发生了什么?

更新已解决

模型上的第二个观察者从未开始射击,因为在教师完成saveOn之后,模型已经完成。我刚刚将saveOn(model, 'teacher.isFulfilled');更改为model.save();,效果很好。

1 个答案:

答案 0 :(得分:1)

传递另一个参数。

function saveOn (target, attribute, then) {
    target.addObserver(attribute, function () {
        if (target.get(attribute)) {
            target.removeObserver(attribute);
            Ember.run.once(target, function() {
                var promise = target.save();
                if(then){ 
                  promise.then(function(){ then(); });
          });
        }
    });
};

或在当时的

中创建另一个承诺并解决
function saveOn (target, attribute) {
    return new Ember.RSVP.Promise(function(resolve, reject){

      target.addObserver(attribute, function () {
        if (target.get(attribute)) {
            target.removeObserver(attribute);
            Ember.run.once(target, function() {
                target.save().then(function(record){ resolve(record); },
                      function(error){ reject(error); });
          });
        }
      });
    });
};
teacher.isFulfilled可能已经更改,因此观察者没有触发,因为它没有改变,在创建观察者之前尝试检查并跳过该部分,如果已经存在/存在等等。