2013-09-24 5 views
6

J'ai du mal à enchaîner les promesses dans un contrôleur Ember.Utiliser les promesses avec Ember

Pour illustrer, je l'ai fait un exemple de la question sur JSBIN here

Sont également inclus le code Ember ici:

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

}); 

Tout conseil serait apprécié.

+0

'this' n'est pas le contrôleur dans le rappel, et' second_request' est une méthode (propriété) pas une fonction (variable). – Bergi

Répondre

11

Il y a deux problèmes, d'abord this ne sont pas disponibles dans le rappel de la promesse parce qu'il est async, cela signifie que le temps la promesse est résolu this plus fait référence au contrôleur, vous devez stocker la valeur d'avance quelque part, comme vous peut voir nous le stocker dans un var appelé self. Et deuxième le .property() sur votre deuxième fonction devrait également être supprimé parce que ce n'est pas nécessaire aussi loin que je peux voir. En outre, vous devez utiliser .send([methodname]) au lieu d'appeler les méthodes du contrôleur directement ou en utilisant la notation .

Cela nous laisse avec cette modification qui rend votre travail exemple:

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

}); 

Le code ci-dessus donne cette sortie de la console:

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

Et ici votre travail jsbin.

Espérons que ça aide.

+0

Merci, c'est une réponse et une explication vraiment claires. En fin de compte, self.send ne fonctionnait pas bien pour moi quand j'essayais d'enchaîner plusieurs promesses et j'ai fini par utiliser un self.get avec une propriété calculée pour retourner la promesse. Je pensais juste que je mentionnerais ceci pour n'importe qui essayant la même chose. – Chris

Questions connexes