2013-09-24 3 views
6

Я изо всех сил пытаюсь переложить обещания в контроллер Ember.Использование обещаний с 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() 

}); 

Любые советы будут оценены.

+0

'this' не является контроллером внутри обратного вызова, а' second_request' является методом (свойством), а не функцией (переменной). – Bergi

ответ

11

Есть две проблемы, первая 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")); 
    } 

}); 

Приведенный выше код дает этот консольный вывод:

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

А вот ваш рабочий jsbin.

Надеюсь, это поможет.

+0

Спасибо, это действительно четкий ответ и объяснение. В конце концов self.send не работал хорошо для меня, пытаясь объединить несколько обещаний, и я закончил использование self.get с вычисленным свойством, чтобы вернуть обещание. Просто подумал, что я упомянул об этом для тех, кто пытается сделать то же самое. – Chris

Смежные вопросы