簡體   English   中英

Async forEach,Node.js中的重排數組

[英]Async forEach , rearranged array in 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);
  });
}

您可以在一個查詢中選擇具有平均評分的電影,這樣會更快並且不會導致重新排列。 使用如下查詢:

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

您可以使用索引將數據設置為數組

result.forEach(function(movie, i) {
    getAverageRating(movie["movieId"], movie["title"], function (data) {
        dataModel[i] = {
            movieId: movie["movieId"],
            title: movie["title"],
            averageRating: data
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM