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实现PHP的print_r函数代码
Mar 14 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 NodeJs
nodejs基础知识
Feb 03 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
详解nodejs中express搭建权限管理系统
Sep 15 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 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/06/14 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
javascript的事件描述
2006/09/08 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
js实现简单点赞操作
2020/03/17 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
深入理解Python中字典的键的使用
2015/08/19 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python字符串下标与切片及使用方法
2020/02/13 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
金宝贝童装官网:Gymboree
2016/08/31 全球购物
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
中文教师求职信
2014/02/22 职场文书
校园活动宣传方案
2014/03/28 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
销售会议开幕词
2015/01/28 职场文书
慈善募捐倡议书
2015/04/27 职场文书
详解redis分布式锁的这些坑
2021/05/19 Redis