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中的非阻塞方法介绍
Jun 05 NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 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
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
javascript hashtable实现代码
2009/10/13 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
jquery中实现标签切换效果的代码
2011/03/01 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
初步剖析C语言编程中的结构体
2016/01/16 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
基于python实现复制文件并重命名
2020/09/16 Python
省级四好少年事迹材料
2014/01/25 职场文书
《老王》教学反思
2014/02/23 职场文书
股份转让协议书
2014/04/12 职场文书
大学新学期计划书
2014/04/28 职场文书
绿色环保演讲稿
2014/05/10 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript