Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使Ember函数从回调返回一个承诺_Javascript_Ember.js_Promise - Fatal编程技术网

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); });
          });
        }
      });
    });
};