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 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodejs 如何手动实现服务器
Aug 20 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
PHP 第二节 数据类型之转换
2012/04/28 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
学习jquery之一
2007/04/27 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
Python 支付整合开发包的实现
2019/01/23 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
Ejb技术面试题
2015/04/29 面试题
少儿励志名言(80句)
2019/08/14 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
Python中的 No Module named ***问题及解决
2022/07/23 Python