异步forEach,在Node.js中重新排列数组
Async forEach , rearranged array in Node.js
我正在查询我的数组,我得到一些结果(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
将数据设置为arrayresult.forEach(function(movie, i) {
getAverageRating(movie["movieId"], movie["title"], function (data) {
dataModel[i] = {
movieId: movie["movieId"],
title: movie["title"],
averageRating: data
});
相关文章:
- 如何删除多行HTML排列中的空白
- 重新排列HTML元素的顺序并更改内容
- 如何使用排列运算符来获取具有命名参数的函数的所有参数
- 从数组中删除重复条目,并在javascript中按顺序排列
- 使用CSS从下到上排列元素
- 我可以't在Divs中获得3个twitter小部件,以便并排排列
- Javascript从数组中随机选择并按字母顺序排列
- 如何在php中按元素按字母顺序排列json文件
- Javascript/jQuery:如何从数组的项中获取排列
- 如何在方向更改时重新调整/排列布局(Apache Cordova)
- 有没有比在本例中使用matchMedia更聪明的方法来重新排列页面元素
- 如何根据 js 中每个单词的第 n 个字母按字母顺序排列列表
- 响应式列表,可在浏览器缩小时重新排列
- Javascript将生日按数组顺序排列
- 比较两个JSON数组并重新排列新的JSON数组格式
- 允许用户在HTML页面上重新排列排列的图像
- 阵列排列排列
- Javascript为jquery选择器重新排列数组
- 砌体重新排列,同时仍然调整大小
- 允许用户重新排列 Django 管理站点中的条目,以及如何存储新的自定义顺序以在页面刷新中幸存下来