Async forEach,重新排列Node.js

时间:2015-10-23 11:25:26

标签: javascript mysql node.js

我正在查询我的数组,我得到了一些结果(10)。我想每次使用查询来获得相同的结果,因为这些是我的tableView数据。但是当我尝试计算每个的平均评级时,我的表每次重新排列,因为它是异步的。我可以保留查询结果中的原始序列吗?

connection.query('SELECT * FROM `movies` WHERE `genres` = "'+genre+'" ORDER BY `movieId` DESC LIMIT 10 OFFSET '+count+'', function(err, result) {
    if (err) throw err;
    result.forEach(function(movie) {
      getAverageRating(movie["movieId"],movie["title"], function (data) {
        dataModel.push({
          movieId: movie["movieId"],
          title: movie["title"],
          averageRating: data
        });
        if (dataModel.length==10) {
          response.send(dataModel);
        }
      });
    });
  });

function getAverageRating (movieId,movieTitle,callback) {

  connection.query('SELECT * FROM `ratings` WHERE `movieId` = ?',[movieId], function(err, result) {
    if (err) {
      return callback(err);
    }
    var sum = 0;
    result.forEach(function(movie) {
      sum += movie["rating"];
    });
    var data = (sum / result.length);

    callback(data);
  });
}

2 个答案:

答案 0 :(得分:1)

您可以在一个查询中选择具有平均评分的电影,它会更快,不会导致重新排列。使用这样的查询:

SELECT m.movieId, m.title, AVG(rating) avg_rating
  FROM (SELECT * FROM movies ORDER BY movieId DESC LIMIT 10 OFFSET 10) m, ratings r
 WHERE m.movieId = r.movieId
 GROUP BY m.movieId, m.title

答案 1 :(得分:0)

您可以使用索引

将数据设置为数组
result.forEach(function(movie, i) {
    getAverageRating(movie["movieId"], movie["title"], function (data) {
        dataModel[i] = {
            movieId: movie["movieId"],
            title: movie["title"],
            averageRating: data
        });