我正在将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);
});
答案 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()(类别)。