node.js - async.each数组项排序顺序自动更改

时间:2013-11-16 14:04:24

标签: node.js sync sails.js

我正在将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);
       });

2 个答案:

答案 0 :(得分:2)

来自文档:

  

注意,由于此函数并行地将迭代器应用于每个项目,因此无法保证迭代器函数将按顺序完成。

为什么不在处理后对数组进行排序?

示例:

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

categories.sort(compareByName);

或者,如果您不必按下请求的最后几毫秒,则可以使用eachSeries代替。

BTW我认为你应该用new Array()替换你的许多{}

答案 1 :(得分:1)

async.each()不是串行执行SaveData(),因此如果要保持新数组(category_list)的项目与原始数组的顺序相同,则可能需要使用async.eachSeries()(类别)。