2013-09-24 54 views
6

我正在努力链接Ember控制器中的承诺。在Ember中使用承诺

为了说明我做了问题的例子在JSBIN here

这里也包括灰烬代码:

App.IndexController = Ember.Controller.extend({ 
    result_of_request: 'nothing', 

    first_request: function() { 

    // create a promise which is immediately resolved 
    var promise = new Ember.RSVP.Promise(function(resolve, reject){ 
     resolve("first resolved"); 
    }); 

    // once the promise has resolved it should call the next function? 
    promise.then(function(data) { 
     // does log the data (has resolved)... 
     console.log("data is : " + data); 

     // but neither this 
     this.set("result_of_request", "first"); 

     // nor this work 
     second_request(); 
    }); 
    }.property(), 

    second_request: function() { 
    console.log("second request"); 
    }.property() 

}); 

任何意见,将不胜感激。

+0

'this'不是控制器内部的回调,'second_request'是方法(属性)而不是函数(变量)。 – Bergi

回答

11

有两个问题,第一this不可承诺回调,因为它是异步里面,这意味着承诺解决this没有更多的指的是控制时间,所以你需要存储的值事先的地方,因为你可以看到我们将它存储在名为self的变量中。第二个功能.property()也应该删除,因为它不是我需要的。此外,您应该使用.send([methodname])而不是直接调用控制器方法或使用点符号

这给我们留下了这样的修改使您的工作例如:

App.IndexController = Ember.Controller.extend({ 
    result_of_request: 'nothing', 

    first_request: function() { 
    var self = this; 

    // create a promise which is immediately resolved 
    var promise = new Ember.RSVP.Promise(function(resolve, reject){ 
     resolve("first resolved"); 
    }); 

    // once the promise has resolved it should call the next function? 
    promise.then(function(data) { 
     // does log the data (has resolved)... 
     console.log("data is : " + data); 

     self.set("result_of_request", "first"); 

     self.send("second_request"); 
    }); 
    }.property(), 

    second_request: function() { 
    console.log("second request"); 
    console.log(this.get("result_of_request")); 
    } 

}); 

上面的代码产生此控制台输出:

"data is : first resolved" 
"second request" 
"first" 

在这里,你的工作jsbin

希望它有帮助。

+0

谢谢,这是一个非常明确的答案和解释。最后,self.send在尝试链接几个promise时并不适用于我,并且最终使用带有计算属性的self.get来返回promise。只是觉得我会提到这一点对于任何尝试同样的事情的人。 – Chris