Node.js的那些坑——如何让异步并发方法同步顺序执行(for循环+异步操作)

时间:2021-07-28 13:39:13

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 参考

1. node.js在遇到“循环+异步”时的注意事项

4 扩展知识

1. Node.js的那些坑(三)——如何在异步方法都执行后再执行

2. Node.js的那些坑(四)——如何让异步并发方法同步顺序执行