nodejs中解决异步嵌套循环和循环嵌套异步的问题


Posted in NodeJs onJuly 12, 2017

众所周知,nodejs异步和循环对于初学者来说是一个很大的问题,今天我们就一起来了解和解决它

当异步和循环同时出现的时候这个问题就会被放大很多倍.

庆幸的是,大神们研究出了async这个第三方模块,解决了node中异步金字塔和循环问题

async这个模块应该是nodejs中使用最多的第三方模块,每个月下载量3000W+

nodejs中解决异步嵌套循环和循环嵌套异步的问题

async基础使用 : https://3water.com/article/118526.htm

异步嵌套循环,循环嵌套异步的例子:

var async = require('async'); 
//初始化 
var async_lists = [{ aa: 11, bb: 21 }, { aa: 31, bb: 41 }, { aa: 51, bb: 61 }, { aa: 71, bb: 81 }, { aa: 91, bb: 91 }]; 
var task = []; 
task.push(function (callback) { 
 console.log('第一个task任务'); 
 //循环 
 async.eachSeries(async_lists, function (async_list, cb) { 
  task_a(async_list, cb) 
 }, function (err) { 
  if (err) return callback(err); 
  //重新赋值 
  async_lists = [{ aa: 12, bb: 22 }, { aa: 32, bb: 42 }, { aa: 52, bb: 62 }, { aa: 72, bb: 82 }, { aa: 92, bb: 92 }]; 
  callback() 
 }); 
}) 
task.push(function (callback) { 
 console.log('第二个task任务'); 
 async.eachSeries(async_lists, function (async_list, cb) { 
  task_a(async_list, cb) 
 }, function (err) { 
  if (err) return callback(err); 
  async_lists = [{ aa: 13, bb: 23 }, { aa: 33, bb: 43 }, { aa: 53, bb: 63 }, { aa: 73, bb: 83 }, { aa: 93, bb: 93 }]; 
  callback() 
 }); 
}) 
task.push(function (callback) { 
 console.log('第三个task任务'); 
 async.eachSeries(async_lists, function (async_list, cb) { 
  task_a(async_list, cb) 
 }, function (err) { 
  if (err) return callback(err); 
  callback() 
 }); 
}) 
 
//最外层流程控制 
async.waterfall(task, function (err, result) { 
 if (err) return console.log(err); 
 console.log('成功'); 
}) 
 
function task_a(async_list, cb) { 
 var task2 = []; 
 task2.push(function (cb) { 
  console.log('第一次 : ', async_list); 
  setTimeout(function () { 
 
   cb() 
  }, 1000); 
 }) 
 task2.push(function (cb) { 
  console.log('第二次 : ', async_list); 
  console.log('---------------------------'); 
  setTimeout(function () { 
 
   cb() 
  }, 1000); 
 }) 
 //循环内流程控制 
 async.waterfall(task2, function (err, result) { 
  if (err) return cb(err); 
  cb(); 
 }) 
}

解释下这个例子:
首先,最外层使用了async.waterfall这个方法控制task数组里的异步任务执行顺序,一共push了3个任务async.waterfall(task, function (err, result) {},每执行完一次task里的任务,重新对async_lists赋值;

然后,每一个task任务里都有一个同样的循环,循环async_lists这个数组里的每一个对象,使用async.eachSeries控制必须循环里所有任务执行完毕才往下执行;

最后,在eachSeries循环里又有一个异步task2任务,这个任务分2步,分别打印了传入进来的async_list的值,而且每次打印都使用setTimeout暂停一秒才执行下一个任务.

预期的结果是 : 首先执行task里的第一个任务,分别打印2次async_lists这个数组里的每个对象,而且每次打印间隔一秒,然后对async_lists重新赋值,执行task里的第二个任务,重复以上操作.3次完成后打印 成功,结束任务.

nodejs中解决异步嵌套循环和循环嵌套异步的问题

nodejs中解决异步嵌套循环和循环嵌套异步的问题

输出的结果也是预期的结果.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
基于promise.js实现nodejs的promises库
Jul 06 NodeJs
轻松创建nodejs服务器(3):代码模块化
Dec 18 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
linux 下以二进制的方式安装 nodejs
Feb 12 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 #NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 #NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 #NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 #NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 #NodeJs
Nodejs之http的表单提交
Jul 07 #NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 #NodeJs
You might like
php命令行使用方法和命令行参数说明
2014/04/08 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
vue中轮训器的使用
2019/01/27 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
python 性能提升的几种方法
2016/07/15 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
Python实现把类当做字典来访问
2019/12/16 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
中科方德软件测试面试题
2016/04/21 面试题
绿化工程实施方案
2014/03/17 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
保安公司服务承诺书
2014/05/28 职场文书
护士实习自荐信
2015/03/06 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript