node.js: el orden de clasificación de los elementos de la matriz async.each cambia automáticamente

StackOverflow https://stackoverflow.com//questions/20019359

  •  21-12-2019
  •  | 
  •  

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);
       });
¿Fue útil?

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 {}.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top