2013-09-24 42 views
6

Tôi đang đấu tranh để hứa hẹn chuỗi trong một bộ điều khiển Ember.Sử dụng lời hứa với Ember

Để minh họa Tôi đã thực hiện một ví dụ về vấn đề này trên JSBIN here

Cũng bao gồm mã Ember ở đây:

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

}); 

Lời khuyên nào sẽ được đánh giá cao.

+0

'this' không phải là Bộ điều khiển bên trong hàm gọi lại và' second_request' là phương thức (thuộc tính) không phải là hàm (biến). – Bergi

Trả lời

11

Có hai vấn đề, trước tiên this không có sẵn trong lời gọi lại vì nó không đồng bộ, nghĩa là thời gian lời hứa được giải quyết this không đề cập đến bộ điều khiển nữa, vì vậy bạn cần lưu trữ giá trị trước đó ở đâu đó có thể thấy chúng tôi lưu trữ nó trong một var gọi là self. Và thứ hai, .property() trên chức năng thứ hai của bạn cũng nên được xóa vì nó không cần thiết cho đến nay tôi có thể nhìn thấy. Hơn nữa, bạn nên sử dụng .send([methodname]) thay vì gọi trực tiếp các phương thức của bộ điều khiển hoặc sử dụng ký hiệu dấu chấm .

này khiến chúng tôi với những thay đổi này làm cho công việc của bạn ví dụ:

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

}); 

Đoạn mã trên mang lại giao diện điều khiển đầu ra này:

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

Và đây làm việc của bạn jsbin.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn bạn, đây là câu trả lời và giải thích thực sự rõ ràng. Cuối cùng self.send đã không hoạt động tốt cho tôi khi cố gắng kết nối với nhau nhiều lời hứa và tôi đã kết thúc bằng cách sử dụng self.get với thuộc tính được tính toán để trả lời lời hứa. Chỉ cần nghĩ rằng tôi muốn đề cập đến điều này cho bất cứ ai đang cố gắng điều tương tự. – Chris

Các vấn đề liên quan