我希望函数返回来自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();
,效果很好。
答案 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可能已经更改,因此观察者没有触发,因为它没有改变,在创建观察者之前尝试检查并跳过该部分,如果已经存在/存在等等。