Node.js的那些坑——如何让异步并发方法同步顺序执行(for循环+异步操作)
1 前言
nodejs的回调,有时候真的是让人又爱又恨的,当需要用for循环把数据依次存入数据库,但是如果使用正常的for循环,永远都是最后一次值的记录,根本不符合要求。
解决此方案有几种,例如闭包(这里利用js函数编程的特性,建立一个闭包来保存每次需要的i值),详情参见参考1和Asyn函数,然后函数的forEach方法也是居于它实现的。
注:async主要实现了很多有用的函数,例如:
- each: 如果想对同一个集合中的所有元素都执行同一个异步操作。
- map: 对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里。与each的区别是,each只关心操作不管最后的值,而map关心的最后产生的值。
- series: 串行执行,一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数。
- parallel: 并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。
- 其它
2 代码
//userIdArr是用户列表 userIdArr.forEach(function(userId){ //var userId = userIdArr[i]; db.get_users_stat(userId, function (data) { if (data == null) { //说明是新用户 var argsMap = {"userId": userId}; db.insert_users_stat(userId, argsMap, function (data2) { if (data2 == null) { callback(null); return; } var index = getIndex(userData,userId); updateUserStat(userData[index]); }); } else { var index2 = getIndexs(userData,userId); updateUserStat(userData[index2]); } }); });
3 参考
4 扩展知识