2015-07-18 4 views
0

Этот вопрос has been asked before, но я не совсем понял ответ.Как оценивать голоса по нескольким дочерним узлам Firebase?

Мне нужно рассчитать среднее значение массива данных из Firebase, поэтому у меня есть два шага.

  1. Получить все данные
  2. Определите, сколько записей есть в том, что те же данные
  3. Вычислить среднее

Мой код:

myDataRef.orderByChild("time").startAt(time-180000).endAt(time).on("child_added", function(snapshot) { 
    votes = snapshot.val().vote; 
    //console.log("Vote value:" + votes) 
}); 

myDataRef.orderByChild("time").startAt(time-180000).endAt(time).on("value", function(snapshot) { 
    numberOfVotes = snapshot.numChildren(); 
    //console.log("Number of Votes:" + numberOfVotes) 
}); 

function calculateAverage(numberOfVotes, votes) { 
    return eval(votes.join('+'))/numberOfVotes; 
} 

console.log(calculateAverage) 

Я думаю, что я неверно истолковывая что-то супер базовое, потому что я не могу понять, как получить данные «из» запроса Firebase и в функцию. Что мне не хватает?

+0

принести вызов функции обратного вызова в, что там данные, необходимые жизни. – dandavis

+0

@ dandavis, но есть два обратных вызова, как мне это обработать? –

ответ

1

Firebase загружает данные асинхронно. Вы можете определить только среднее значение, как только данные были загружены. полностью.

Один из способов, который приходит на ум:

myDataRef.orderByChild("time").startAt(time-180000).endAt(time).on("value", function(snapshot) { 
    var voteCount = snapshot.numChildren(); 
    var total = 0; 
    snapshot.forEach(function(voteSnapshot) { 
     total += voteSnapshot.val().vote; 
    }); 
    console.log("Average=" + total/voteCount); 
}); 

Некоторые вещи на заметку:

  • я использую один value событие. Не знаете, почему вы использовали value и child_added, но это только усложняло ситуацию.

Также возможно поддерживать среднее значение при прослушивании child_ событий, но вам придется прислушиваться ко всем из них.

var total = 0, 
    voteCount = 0; 
    query = myDataRef.orderByChild("time").startAt(time-180000).endAt(time); 
query.on("child_added", function(snapshot) { 
    voteCount += 1; 
    total += snapshot.val().vote; 
    console.log("Running average: "+total/voteCount); 
}); 
query.on("child_removed", function(snapshot) { 
    voteCount -= 1; 
    total -= snapshot.val().vote; 
    console.log("Running average: "+total/voteCount); 
}); 
0

Я делал то же самое, что вы пытаетесь сделать, но с пользовательскими рейтингами. Я изменил условия «рейтинги» на «голоса» для вас и добавил «myDataRef». Это работает для меня:

Контроллер:

myDataRef.getVotesforUser(uid).then(function(votes) { 

for(var i = 0; i < votes.length; i++) { 
    votes[i].type? $scope.userVote.push(votes[i]) : $scope.userVote.push(votes[i]) 
} 

$scope.numVote = $scope.userVote.length; 


$scope.total = 0; 
votes.forEach(function(votes) { 
    $scope.total += votes.vote; 
}); 
console.log("average", + $scope.total); 
console.log("average", + $scope.total/$scope.numVote); 

});

Услуги:

getVotesforUser: function(uid) { 
    var defer = $q.defer(); 

    $firebaseArray(ref.child('user_votes').child(uid)) 
     .$loaded() 
     .then(function(votes) { 
     defer.resolve(votes); 
     }, function(err) { 
     defer.reject(); 
     }); 


    return defer.promise; 
    }, 
Смежные вопросы