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的模块写法入门(实例代码)
Mar 07 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
nodeJs内存泄漏问题详解
Sep 05 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
nodejs实例解析(输出hello world)
Jan 03 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
Mar 16 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
M2实现Nodejs项目自动部署的方法步骤
May 05 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 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
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
Python生成pdf文件的方法
2014/08/04 Python
python基础教程之五种数据类型详解
2017/01/12 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
Python实现像awk一样分割字符串
2020/09/15 Python
Django多个app urls配置代码实例
2020/11/26 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
数据库专业英语
2012/11/30 面试题
护士自我评价范文
2014/01/25 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
学习计划书怎么写
2014/09/15 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
初中教师个人工作总结
2015/02/10 职场文书