node.js - автоматически меняется порядок сортировки элементов массива async.each

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

  •  21-12-2019
  •  | 
  •  

Вопрос

я использую node.js с библиотекой asyn(https://github.com/caolan/async).Когда я использую функцию async.each, она работает хорошо, но меняет порядок элементов массива, поэтому я не могу перечислить категории с некоторой сортировкой.

        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: {}  
        };

я использую функцию async.each

      async.each(categories, SaveData, function(err){
                    // if any of the saves produced an error, err would equal that error
                    callback(null);
       });
Это было полезно?

Решение

async.each () не выполняет Savedata () последовательно, поэтому вы можете использовать Async.eachseries (), если вы хотите сохранить элементы нового массива (Cate_List) в том же порядке, что и исходный массив (категории).

Другие советы

Из документов:

Обратите внимание: поскольку эта функция применяет итератор к каждому элементу параллельно, нет никакой гарантии, что функции итератора будут выполняться по порядку.

Почему бы вам просто не отсортировать массив после обработки?

Пример:

function compareByName(row1, row2) {
    if (row1.name > row2.name) {
        return 1;
    }
    return row1.name === row2.name ? 0 : -1;
}

categories.sort(compareByName);

Или, если вам не нужно нажимать последние миллисекунды на запрос, вы можете использовать eachSeries вместо.

Кстати, я думаю, вам следует заменить многие из ваших new Array() к {}.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top