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 相关文章推荐
利用NodeJS的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
初探nodeJS
Jan 24 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
nodejs6下使用koa2框架实例
May 18 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 NodeJs
node快速搭建后台的实现步骤
Feb 18 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取整的几种方式
2013/06/25 PHP
PHP实现递归无限级分类
2015/10/22 PHP
iframe 异步加载技术及性能分析
2011/07/19 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
Python yield 小结和实例
2014/04/25 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
python安装scipy的方法步骤
2019/06/26 Python
python实现飞机大战小游戏
2019/11/08 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
微型企业创业投资计划书
2014/01/10 职场文书
实习评语大全
2014/04/26 职场文书
警示教育活动总结
2014/05/05 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
实习班主任自我评价
2015/03/11 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
详解Java实践之适配器模式
2021/06/18 Java/Android
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis