2013-09-24 15 views
6

私はEmberコントローラで約束を守るのに苦労しています。私はJSBIN hereEmberと約束を使用

上の問題の例を作った説明するために

もここエンバーコードが含まれていました。

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という名前のvarに格納されています。また、第2の関数の.property()も、私が見る限りでは必要ないので、削除する必要があります。さらに、コントローラーメソッドを直接呼び出したり、のドット表記を使用する代わりに、.send([methodname])を使用する必要があります。

これはあなたの例の作品を作るこの変更を私たちに残し:

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

そしてここにあなたの作業jsbin

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

}); 

上記のコードは、このコンソール出力が得られます。

希望します。

+0

ありがとう、これは本当に明確な答えと説明です。最終的には、いくつかの約束をつなぎ合わせるときにself.sendがうまく動かず、約束を返すために計算されたプロパティを持つself.getを使い終わった。ちょうど私が同じことをしようとする人のためにこれを言いたいと思った。 – Chris