node.js - l'ordre de tri des éléments du tableau async.each change automatiquement

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

  •  21-12-2019
  •  | 
  •  

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);
       });
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top