Javascript 使Ember函数从回调返回一个承诺
我想让一个函数从Javascript 使Ember函数从回调返回一个承诺,javascript,ember.js,promise,Javascript,Ember.js,Promise,我想让一个函数从model.save()返回承诺,但是对model.save()的调用是在回调中,因此不构成链。我的意思是: function saveOn (target, attribute) { target.addObserver(attribute, function () { if (target.get(attribute)) { target.removeObserver(attribute); Ember.
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();
});
}
});
};
(此函数是解决此问题所必需的)
我想要target.save()代码>行改为:返回target.save()代码>
然后我可以这样做:
saveOn().then();
这是不起作用的,错误消息仅仅是然后
在该对象上不存在
更新
console.log(“Model”)代码>已成功调用,但该模型从未持久化。
这里发生了什么事
更新已解决
模型上的第二个观察者从未开火,因为在教师完成saveOn
后,模型已经完成。我刚刚更改了saveOn(model'teacher.iscompleted')
到model.save()代码>,效果很好。传递另一个参数
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.isemplied可能已经更改,因此观察者没有触发,因为它没有更改,请在创建观察者之前尝试检查,如果已经存在,则跳过该部分。第二个部分完全按照我的希望工作。感谢您明确承诺API!其实没关系。。我正在把第二期的新问题编辑成我原来的问题。没关系!您的实现非常好,但由于它起作用,它改变了我所做的假设。再次感谢你的帮助!我想了一会儿,Ember.run.once
干扰了第二个调用,但我删除了它,它没有什么区别。
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); });
});
}
});
});
};