【问题标题】:Using promises with Ember在 Ember 中使用 Promise
【发布时间】:2013-09-25 01:01:33
【问题描述】:

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

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

这里还包含了 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()

});

任何建议将不胜感激。

【问题讨论】:

  • this 不是回调内部的Controller,second_request 是方法(属性)而不是函数(变量)。

标签: javascript ember.js promise


【解决方案1】:

有两个问题,首先this在promise回调中不可用,因为它是异步的,这意味着解决promise的时间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

希望对你有帮助。

【讨论】:

  • 谢谢,这是一个非常明确的答案和解释。最后,当我尝试将几个 Promise 链接在一起时,self.send 对我来说效果不佳,我最终使用带有计算属性的 self.get 来返回 Promise。只是想我会为任何尝试同样事情的人提到这一点。
猜你喜欢
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多