Node.js的那些坑——如何让异步并发方法同步顺序执行(for循环+异步操作)
2023-09-11 14:18:06 时间
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 扩展知识
相关文章
- 优化 JS 程序的一个小方法
- baguetteBox.js响应式画廊插件(纯JS)
- js 生成Excel
- [Cycle.js] Hyperscript as our alternative to template languages
- a链接中 JS弹出确认对话框方法
- 文本框文字处理工具类js+代码高亮组件
- java、js中实现无限层级的树形结构(类似递归)
- Java使用正则表达式取网页中的一段内容(以取Js方法为例)
- a链接中 JS弹出确认对话框方法
- js工具方法
- 使用Fiddle修改在线加载的前端框架js文件,用于各种调试目的
- Atitit 业务流程执行引擎的实现 目录 1.1. 引擎实现语言java js php等1 1.2. 流程语言 xml sql js等 业务流程定义语言规范总结1 1.3. 实体方法定义2
- Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针
- paip.编程语言方法重载实现的原理及python,php,js中实现方法重载
- express中response.js 提供的sendFile方法的调试
- Node.js 应用的内存泄漏问题的检测方法
- js金额补充--2位小数0demo效果(整理)
- Chrome浏览器,搜索JS方法。
- js 递归修改json无限级key值
- js焦点轮播图
- vue.js中引入图片
- 007-js中的Array常用方法
- thinkphp在前端页面的js代码中可以使用 U方法吗? 可以使用模板变量如__URL__等吗?
- JS中判断null、undefined与NaN的方法
- JS中sort()方法原理及使用
- js data日期初始化的5种方法
- JS 数组常用函数(数组合并、数组转字符串、顺序反转、范围选择、排序、插入数据、删除数据)
- JS表达式完全攻略