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的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 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/07/11 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
php数组和链表的区别总结
2019/09/20 PHP
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python 12306抢火车票脚本
2018/02/07 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
Python模块的加载讲解
2019/01/15 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
python 8种必备的gui库
2020/08/27 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
幼儿园安全责任书
2014/04/14 职场文书
大学生求职计划书
2014/04/30 职场文书
现场施工员岗位职责
2015/04/11 职场文书
质量承诺书格式范文
2015/04/28 职场文书
电影建国大业观后感
2015/06/01 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA