2013-09-24 9 views
6

Ich habe Schwierigkeiten, Versprechen in einem Ember-Controller zu verketten.Versprechungen mit Ember verwenden

Zur Veranschaulichung ich ein Beispiel für die Ausgabe gemacht habe auf JSBIN here

auch hier den Ember-Code enthalten:

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

}); 

Jede Beratung geschätzt würde.

+0

'this' ist nicht der Controller innerhalb des Callbacks und' second_request' ist eine Methode (property) keine Funktion (Variable). – Bergi

Antwort

11

Es gibt zwei Probleme, erste this innerhalb der Versprechen Rückruf nicht verfügbar ist, weil es Asynchron bedeutet dies, die Zeit, das Versprechen this nicht mehr bezieht sich auf die Steuerung gelöst wird, so dass Sie den Wert vorher irgendwo speichern müssen, wie Sie können wir sehen, speichern wir es in einer Var namens self. Und zweitens sollte die .property() auf Ihrer zweiten Funktion ebenfalls entfernt werden, da sie nicht so weit benötigt wird, wie ich sehen kann. Außerdem sollten Sie .send([methodname]) verwenden, anstatt die Controller-Methoden direkt aufzurufen oder die Punktnotation zu verwenden.

Dies lässt uns mit dieser Modifikationen Ihr Beispiel Arbeit machen:

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

}); 

Der obige Code liefert diese Konsole Ausgabe:

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

Und hier Ihre jsbin arbeiten.

Ich hoffe, es hilft.

+0

Danke, das ist eine wirklich klare Antwort und Erklärung. Am Ende funktionierte self.send nicht gut für mich, als ich versuchte, mehrere Versprechen zusammen zu ketten. Am Ende nutzte ich ein self.get mit einer berechneten Eigenschaft, um das Versprechen zurückzugeben. Ich dachte, ich würde das für jeden erwähnen, der dasselbe versucht. – Chris

Verwandte Themen