2017-07-27 66 views
2

我被困在试图返回一堆承诺的值。Ember中的多个承诺不会在模板中解析

说明情况:有4个车型 - 学生 S IN一有一个得分每个目标

所以我做了一个组件,其中我通过了一个目标。该组件然后处理到商店的请求,以查找每个学生的得分,该目标,并返回平均值。

该代码似乎工作,console.logs给我正是我想要的,直到最后,但承诺不会解析到模板中 - 我得到{对象对象},我相信是未解决的承诺。

我在这里失踪的东西?在等待多个承诺解决时是否需要额外的步骤?

我很欣赏这有点具体,当我明白答案时,我会尝试重新解释这个问题。

组件代码:

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

该组件的模板,然后简单地返回averageScore

谢谢

回答

1

计算属性不是承诺意识。因此,不要在计算属性内部返回Promise,并且通常不会在计算属性内执行任何设置。

在你的情况,你可以有属性命名averageScore和做任何的组件生命周期挂钩方法编写代码。(可能是initdidReceiveAttrs钩)。您可以将结果设置为averageScore属性this.set('averageScore',result)

如果你仍然想使计算性能答应意识到然后按照这个ember igniter link

+1

可以发誓我做之前......没有吧!完美的答案,谢谢你的时间。使用didReceiveAttrs来设置属性。 – rjoxford