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 相关文章推荐
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 NodeJs
Nodejs学习笔记之Global Objects全局对象
Jan 13 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
nodejs文件夹深层复制功能
Sep 03 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 form 表单传参明细研究
2009/07/17 PHP
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
JS实现小星星特效
2019/12/24 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
python通过smpt发送邮件的方法
2015/04/30 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
Python银行系统实战源码
2019/10/25 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
生产部主管岗位职责
2014/01/06 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
网站推广策划方案
2014/06/04 职场文书
学校党员对照检查材料
2014/08/28 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python