2013-11-16 2 views
1

Я использую node.js с библиотекой asyn (https://github.com/caolan/async). Когда я использую функцию async.each его рабочую, но это изменение элемента массива заказов, так что я не могу перечислить категории с некоторой сортировкой ..node.js - порядок сортировки элементов массива 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); 
     }); 

ответ

1

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

+0

async.eachSeries() - лучшее решение ... – balaphp

2

С docs:

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

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

Пример:

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() на {}.

Смежные вопросы