使用Ember的承诺

Chr*_*ris 7 javascript promise ember.js

我正努力在Ember控制器中链接承诺.

为了说明我在这里JSBIN问题做了一个例子

此处还包括Ember代码:

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()

});
Run Code Online (Sandbox Code Playgroud)

任何意见,将不胜感激.

int*_*xel 12

有两个问题,第一this是不可用的承诺回调,因为它是异步里面,这意味着承诺解决的时候this没有更多的是指控制器,所以你需要存储的值事先的地方,你可以看到我们把它存放在一个叫做的var 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"));
  }

});
Run Code Online (Sandbox Code Playgroud)

上面的代码产生了这个控制台输出:

"data is : first resolved"
"second request"
"first"
Run Code Online (Sandbox Code Playgroud)

在这里你的工作jsbin.

希望能帮助到你.