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学习笔记之网络编程
Aug 03 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 NodeJs
nodejs中使用worker_threads来创建新的线程的方法
Jan 22 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三层结构(上) 简单三层结构
2010/07/04 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
canvas的神奇用法
2017/02/03 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
Cython 三分钟入门教程
2009/09/17 Python
神经网络python源码分享
2017/12/15 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
python梯度下降算法的实现
2020/02/24 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
三星印度官网:Samsung印度
2019/08/03 全球购物
导师评语大全
2014/04/26 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
优秀教研组申报材料
2014/12/26 职场文书
倡议书格式及范文
2015/04/29 职场文书
婚育证明样本
2015/06/16 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL