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服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
3分钟快速搭建nodejs本地服务器方法运行测试html/js
Apr 01 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
NodeJS收发GET和POST请求的示例代码
Aug 25 NodeJs
ubuntu编译nodejs所需的软件并安装
Sep 12 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
May 15 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
浅谈Node的内存泄露问题
May 06 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中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
php计算title标题相似比的方法
2015/07/29 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
javascript instanceof,typeof的区别
2010/03/24 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
轻松搞定jQuery+JSONP跨域请求的解决方案
2018/03/06 jQuery
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
Vue中props的使用详解
2018/06/15 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
Python logging模块学习笔记
2014/05/24 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
Django实现分页显示效果
2019/10/31 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
数据库笔试题
2013/05/09 面试题
Linux面试题LINUX系统类
2015/11/25 面试题
应用化学专业本科生求职信
2013/09/29 职场文书
大学生个人事迹材料
2014/01/21 职场文书
说明书格式及范文
2014/05/07 职场文书
教师思想工作总结2015
2015/05/13 职场文书
详解python字符串驻留技术
2021/05/21 Python
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python
Java 数组的使用
2022/05/11 Java/Android