2013-09-24 31 views
6

Sto faticando a concatenare promesse in un controller Ember.Utilizzo di promesse con Ember

Per illustrare Ho fatto un esempio del problema su JSBIN here

comprendeva anche il codice di Ember qui:

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

}); 

Tutto il consiglio sarebbe apprezzato.

+0

'questo' non è il controller all'interno del callback e 'second_request' è un metodo (proprietà) non una funzione (variabile). – Bergi

risposta

11

Ci sono due problemi, prima this non è disponibile all'interno del callback promessa perché è asincrona, questo significa che il tempo della promessa si risolve this più si riferisce al controller, quindi è necessario memorizzare il valore in precedenza da qualche parte, come si possiamo vedere che lo memorizziamo in una var chiamata self. E in secondo luogo il .property() sulla tua seconda funzione dovrebbe anche essere rimosso perché non è necessario per quanto posso vedere. Inoltre, è necessario utilizzare .send([methodname]) anziché richiamare direttamente i metodi del controller o utilizzare la notazione dot.

Questo ci lascia con queste modifiche rendere il vostro lavoro esempio:

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

}); 

Il codice di cui sopra produce questo output della console:

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

E qui il tuo lavoro jsbin.

Spero che aiuti.

+0

Grazie, questa è una risposta e una spiegazione molto chiare. Alla fine, self.send non ha funzionato bene per me quando ho cercato di mettere insieme diverse promesse e ho finito per usare un self.get con una proprietà calcolata per restituire la promessa. Ho pensato di menzionarlo per chiunque provasse la stessa cosa. – Chris