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框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
NodeJs模拟登陆正方教务
Apr 28 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 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+DBM的同学录程序(4)
2006/10/09 PHP
PHP新手上路(三)
2006/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
11个PHPer必须要了解的编程规范
2014/09/22 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
PHP排序算法类实例
2015/06/17 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
javascript语言结构小记(一)
2011/09/10 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
python读取文件名并改名字的实例
2019/01/07 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
浅析python连接数据库的重要事项
2021/02/22 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
就业自荐信
2013/12/04 职场文书
项目管理计划书
2014/01/09 职场文书
社区义诊活动总结
2014/04/30 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
2014年质检工作总结
2014/11/26 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python