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(三)--- Node.js模块
May 25 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
Nodejs+Socket.io实现通讯实例代码
Feb 13 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
NodeJS配置CORS实现过程详解
Dec 02 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中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
基于jQuery实现的无刷新表格分页实例
2016/02/17 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
python实现socket客户端和服务端简单示例
2014/02/24 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
如何写自我鉴定
2014/03/19 职场文书
师德演讲稿范文
2014/05/06 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
2015年植树节活动总结
2015/02/06 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL