7

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

});

アドバイスをいただければ幸いです。

4

1 に答える 1

12

2 つの問題があります。1 つ目thisは非同期であるため、Promise コールバック内で使用できません。これは、Promise が解決された時点でthisコントローラーを参照しなくなることを意味します。したがって、値を事前にどこかに保存する必要があります。と呼ばれる変数self。そして.property()、2番目の関数も削除する必要があります。これは、私が見る限り必要ないためです。さらに、コントローラ メソッドを直接呼び出したり、ドット表記.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があります。

それが役に立てば幸い。

于 2013-09-24T14:37:54.083 に答える