node.js: el orden de clasificación de los elementos de la matriz async.each cambia automáticamente
Pregunta
Estoy usando node.js con la biblioteca asyn (https://github.com/caolan/async).Cuando uso la función async.each, funciona bien, pero cambia el orden de los elementos de la matriz, por lo que no puedo enumerar las categorías con cierta clasificación.
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: {}
};
Estoy usando async.cada función
async.each(categories, SaveData, function(err){
// if any of the saves produced an error, err would equal that error
callback(null);
});
Solución
async.each.each no está ejecutando Savedata () en serie, por lo que es posible que desee usar async.eachseries () si desea mantener los elementos de la nueva matriz (categoría_list) en el mismo orden que la matriz original (categorías).
Otros consejos
De los documentos:
Tenga en cuenta que, dado que esta función aplica el iterador a cada elemento en paralelo, no hay garantía de que las funciones del iterador se completen en orden.
¿Por qué no ordenas la matriz después del procesamiento?
Ejemplo:
function compareByName(row1, row2) {
if (row1.name > row2.name) {
return 1;
}
return row1.name === row2.name ? 0 : -1;
}
categories.sort(compareByName);
O si no tiene que presionar los últimos milisegundos de la solicitud, puede usar eachSeries
en cambio.
Por cierto, creo que deberías reemplazar muchos de tus new Array()
por {}
.