node.js - l'ordre de tri des éléments du tableau async.each change automatiquement
Question
j'utilise node.js avec la bibliothèque asyn (https://github.com/caolan/async).Lorsque j'utilise la fonction async.each, cela fonctionne bien mais cela modifie l'ordre des éléments du tableau, je ne peux donc pas lister les catégories avec un certain tri.
module.exports = {
index: function (req, res) {
var async = require('async');
var data = new Object();
data.title = "";
data.meta_keywords = "";
data.meta_description = "";
data.category = new Array();
bredcrumbs = new Array();
bredcrumbs[0] = {'text':'Home','link':'Link','active':false};
category_list = new Array();
categories = new Array();
async.waterfall([
function(callback){
Category.find({sort: 'name ASC'}).done(function(err,cat_data){
//console.log(cat_data);
categories = cat_data;
callback(null);
});
},
function(callback){
async.each(categories, SaveData, function(err){
// if any of the saves produced an error, err would equal that error
callback(null);
});
},
], function () {
data.category = category_list;
//console.log(category_list);
res.view('pages/home',data);
});
function SaveData(item,callback){
Word.count({category_id:item['id'],status:'1',is_approved:'1'}).done(function(err, total){
t_category = new Array();
t_category['name'] = item['name'];
t_category['keyword'] = item['keyword'];
t_category['link'] = "http://"+req.headers.host+"/game/"+item['keyword'];
t_category['total'] = total;
category_list.push(t_category);
callback(null);
});
}
},
/**
* Overrides for the settings in `config/controllers.js`
* (specific to HomeController)
*/
_config: {}
};
j'utilise la fonction async.each
async.each(categories, SaveData, function(err){
// if any of the saves produced an error, err would equal that error
callback(null);
});
La solution
async.ache () n'exécute pas SAVEDATA () en série afin que vous puissiez utiliser async.eachseries () si vous souhaitez conserver les éléments du nouveau tableau (catégorie_list) dans le même ordre que le tableau d'origine (Catégories).
Autres conseils
À partir des documents :
Notez que puisque cette fonction applique l'itérateur à chaque élément en parallèle, il n'y a aucune garantie que les fonctions de l'itérateur se termineront dans l'ordre.
Pourquoi ne triez-vous pas simplement le tableau après le traitement ?
Exemple:
function compareByName(row1, row2) {
if (row1.name > row2.name) {
return 1;
}
return row1.name === row2.name ? 0 : -1;
}
categories.sort(compareByName);
Ou si vous n'avez pas besoin d'appuyer sur la requête pendant les dernières millisecondes, vous pouvez utiliser eachSeries
plutôt.
BTW, je pense que vous devriez remplacer plusieurs de vos new Array()
par {}
.