【问题标题】:Make Ember function return a promise from callback让 Ember 函数从回调中返回一个承诺
【发布时间】:2013-12-10 00:32:34
【问题描述】:

我想让一个函数返回来自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();,效果很好。

【问题讨论】:

  • 我一度以为Ember.run.once 干扰了第二次通话,但我删除了它,但没有任何影响。

标签: javascript ember.js promise


【解决方案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(); });
          });
        }
    });
};

或者创建另一个promise并在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 可能已经改变,所以观察者没有触发,因为它没有改变,在创建观察者之前尝试检查,如果已经为真/存在则跳过该部分等。

【讨论】:

  • 第二个完全符合我的期望。感谢您明确 Promise API!
  • 其实没关系..我正在将我的新问题与第二个问题一起编辑到我原来​​的问题中。
  • 别再介意了!您的实现很棒,但是由于它有效,它改变了我所做的假设。再次感谢您的帮助!
猜你喜欢
  • 2015-11-27
  • 1970-01-01
  • 2016-06-15
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
相关资源
最近更新 更多