前言
在使用nodejs使用过程中经常需要进行callback很多层才能完成最终功能,嵌套太深。这里使用async插件来替代嵌套。
我常用的async方法说明。async插件API位置https://github.com/caolan/async。
series
series(task[, callback]);
- task - 一个包含需要运行函数function的集合,每个函数都必须有一个callback(err, result)函数作为参数。
- callback(err, result) – 当所有task函数执行完成之后将回调它,这个函数将得到一个result数组或对象,包含所有task通过自身回调函数传入的result。
例如:
async.series([ function(callback){ // do some stuff ... callback(null, 'one'); }, function(callback){ // do some more stuff ... callback(null, 'two'); } ], // optional callback function(err, results){ // results is now equal to ['one', 'two'] }); // an example using an object instead of an array async.series({ one: function(callback){ setTimeout(function(){ callback(null, 1); }, 200); }, two: function(callback){ setTimeout(function(){ callback(null, 2); }, 100); } }, function(err, results) { // results is now equal to: {one: 1, two: 2} });
each
each(coll, iteratee[, callback])
主要作用就是迭代coll中的元素,进行处理。
//存放每个房间中的所有card和jiracard,计算总的工作时间 var result = []; async.eachSeries(rooms, function (room, done) { db.getAllCards('/' + room, function (res) { db.getAllJiraCards('/'+ room, function(jiraCards){ var cards = res.concat(jiraCards); var totalTime = 0; if (cards != null && cards.length > 0) { for (var j = 0; j < cards.length; j++) { if(cards[j].statusIndex != 2){ continue; } //调用了一个公共模块,主要是进行时间计算,可以忽略 totalTime += util.calculateTime(cards[j].workTime); } } //在每一而room执行完成之后就将结果放入到result结果集中,因为这里的done回调函数 //作用不大,我没有发现他的作用。 result.push({room: room, totalTime: totalTime}); done(null); }); }); }, function (err) { //回调 callback(result); });
以上是在工作过程中用到的两种处理方式。根据api你可以选择一种适合自己的方式来完成相关工作。