异步forEach,在Node.js中重新排列数组

Async forEach , rearranged array in Node.js

本文关键字:新排列 排列 数组 forEach Node js 异步      更新时间:2023-09-26

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

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

您可以在一次查询中选择平均评分的电影,这样会更快,不会造成重排。像这样使用查询:

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

您可以使用index

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