2017-07-27 4 views
2

Ich bin stecken, versuchen, den Wert einer Reihe von Versprechen zurückzugeben.Mehrere Versprechen in Ember wird nicht in der Vorlage lösen

die Situation zu erklären: Es gibt vier Modelle - die Schüler s in einer Gruppe haben ein für jedes Ziel punkten.

Also habe ich eine Komponente, in denen ich ein Ziel und die Gruppe Pässe gemacht. Die Komponente verarbeitet dann die Anfragen an den Laden, um die Punkte jedes Schülers für das Ziel nachzuschlagen und den Durchschnitt zurückzugeben.

Der Code scheint zu funktionieren, die console.logs geben mir genau das, was ich will, bis zum Ende, aber die Versprechen werden nicht in die Vorlage aufgelöst - ich bekomme das {Objekt Object}, was ich glaube das ungelöste Versprechen.

Etwas fehlt mir hier? Ist ein zusätzlicher Schritt erforderlich, wenn auf mehrere Versprechungen gewartet werden muss?

Ich weiß, das ist ein wenig spezifisch, wenn ich die Antwort verstehe, werde ich versuchen und die Frage umformulieren.

Component Code:

averageScore: Ember.computed(function(){ 
    var students = this.get('group.students'); 
    var objective = this.get('objective'); 
    var store = this.get('store'); 
    var _this = this; 

    // Create an array of promises of each student's scores 
    var promises = []; 
    students.forEach((student) => { 
     var studentId = student.get('id'); 
     var objectiveId = objective.get('id'); 
     var newPromise = store.queryRecord('snapscore', { 'student' : studentId, 'objective': objectiveId }); 
     promises.pushObject(newPromise); 
    }); 
    // When promises resolve, find and return the average 
    return Ember.RSVP.allSettled(promises).then(function(scores){ 
     let scoreTotal = 0; 
     let scoreCount = scores.length; 
     console.log("Score count is " + scoreCount); 
     scores.forEach((score)=>{ 
      console.log("Student's score is " + score.value.get('score')); 
      scoreTotal = scoreTotal + score.value.get('score'); 
     }); 
     console.log("ScoreTotal is " + scoreTotal); 
     var average = scoreTotal/scoreCount; 
     console.log(average); 
     console.log(typeof(average)); 
     return average; 
    }); 
}), 

der Vorlage Komponente gibt dann einfach averageScore.

Dank

Antwort

1

Berechnete Eigenschaft ist nicht Versprechen bewusst. Geben Sie also Promise nicht innerhalb der berechneten Eigenschaft zurück, und setzen Sie in der Regel keine Menge innerhalb der berechneten Eigenschaft.

In Ihrem Fall können Sie Eigentum averageScore benannt haben und Sie Ihren Code in einem der Komponentenlebenszyklus Hook-Methoden schreiben. (Kann init oder didReceiveAttrs Haken sein). Sie können das Ergebnis auf averageScore Eigenschaft this.set('averageScore',result) festlegen.

Wenn Sie noch berechnete Eigenschaft machen wollen folgen bewusst versprechen, dann ist diese ember igniter link

+1

ich es getan hätte schwören können, bevor ... denke nicht! Perfekte Antwort, danke für deine Zeit. Verwendet didReceiveAttrs, um die Eigenschaft festzulegen. – rjoxford

Verwandte Themen