Javascript异步编程async实现过程详解


Posted in Javascript onApril 02, 2020

async官方DOC

介绍

node安装

npm install async --save

使用

var async = require('async')

js文件

https://github.com/caolan/async/tree/master/dist

async提供了很多函数用于异步流程控制,下面是async核心的几个函数,完整的函数请看async官方DOC

async.map(['file1','file2','file3'], fs.stat, function(err, results) {
  // results is now an array of stats for each file
});

async.filter(['file1','file2','file3'], function(filePath, callback) {
 fs.access(filePath, function(err) {
  callback(null, !err)
 });
}, function(err, results) {
  // results now equals an array of the existing files
});

async.parallel([
  function(callback) { ... },
  function(callback) { ... }
], function(err, results) {
  // optional callback
});

async.series([
  function(callback) { ... },
  function(callback) { ... }
]);

series串行

series的作用就是按照顺序一次执行。

async.series([
 function(callback) {
  setTimeout(function() {
   callback(null, 1)
    }, 2000);
  },
 function(callback) {
  callback(null, 2);
 }],
 function(err, results) {
  console.log(results);
 });

输出结果为

[ 1, 2 ]

series函数的第一个参数可以是一个数组也可以是一个JSON对象,参数类型不同,影响的是返回数据的格式。

async.series({
	one: function(callback){
		callback(null, 1);
	},
	two: function(callback){
		callback(null, 2);
	}
},function(err, results) {
	console.log(results);
});

输出为

{one: 1, two: 2}

waterfall瀑布流

waterfall和series函数都是按照顺序执行,不同之处是waterfall每个函数产生的值都可以传递给下一个函数,series不可以。

async.waterfall([
	function(callback) {
		callback(null, 'one', 'two');
	},
	function(arg1, arg2, callback) {
		// arg1 now equals 'one' and arg2 now equals 'two'
		console.log('function 2')
		console.log('arg1: ' + arg1)
		console.log('arg2: ' + arg2)
		callback(null, 'three');
	},
	function(arg1, callback) {
		console.log('function 3')
		console.log('arg1: ' + arg1)
			// arg1 now equals 'three'
		callback(null, 'done');
	}
], function(err, result) {
	// result now equals 'done'
	console.log(result);
});

输出

function 2
arg1: one
arg2: two
function 3
arg1: three
done

waterfall第一个参数只能为数组。当中途有函数出错,其err直接传给最终callback,结果被丢弃,后面的函数不再执行。

parallel(tasks, [callback])

paraller函数是并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。
传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。

async.parallel([
  function(callback){
    callback(null, 'one');
  },
  function(callback){
    callback(null, 'two');
  }
],
function(err, results){

});

tasks参数可以是一个数组或是json对象,和series函数一样,tasks参数类型不同,返回的results格式会不一样。

将示例中tasks的回调函数用setTimeout在1000毫秒后调用,然后在parallel的回调函数中输出results,看一看整个过程花费了1s还是2s。

var async=require("async");
async.parallel([
  function(callback){
    setTimeout(function(){
      callback(null, 'one')
    },1000);
  },
  function(callback){
    setTimeout(function(){
      callback(null, 'two')
    },1000);
  }
],
function(err, results){
  console.log(results);
});

parallelLimit(tasks, limit, [callback])

parallelLimit函数和parallel类似,但是它多了一个参数limit。 limit参数限制任务只能同时并发一定数量,而不是无限制并发,示例如下:

async.parallelLimit([
  function(callback){
    callback(null, 'one');
  },
  function(callback){
    callback(null, 'two');
  }
],
2,
function(err, results){
});

将示例中tasks的回调函数用setTimeout在1000毫秒后调用,limit参数设置为1,然后在parallelLimit的回调函数中输出results,看一看整个过程花费了1s还是2s。

var async=require("async");
async.parallelLimit([
  function(callback){
    setTimeout(function(){
      callback(null, 'one');
    }, 1000);
  },
  function(callback){
    setTimeout(function(){
      callback(null, 'two');
    }, 1000);
  }
],
1,
function(err, results){
  console.log(results);
});

map(coll, iteratee, callbackopt)

map函数遍历传入的数组,并执行同样的操作,最终返回结果

cool:数组

iteratee:对数组每一项要执行的函数

callbackopt:回调函数

async.map([1, 2, 3, 4, 5],
	function(item, callback) {
		callback(null, item + 5)
	},
	function(err, result) {
		console.log(result)
	})

[ 6, 7, 8, 9, 10 ]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript call和apply区别及使用方法
Nov 14 Javascript
使用node.js 制作网站前台后台
Nov 13 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
Aug 04 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
原生js实现弹出层登录拖拽功能
Dec 05 Javascript
AngularJS指令与指令之间的交互功能示例
Dec 14 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
vue中的模态对话框组件实现过程
May 01 Javascript
JavaScript实现百度搜索框效果
Mar 26 Javascript
vue环形进度条组件实例应用
Oct 10 Javascript
泛谈JS逻辑判断选择器 || &&
May 24 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 #Javascript
JavaScript运动原理基础知识详解
Apr 02 #Javascript
基于js实现逐步显示文字输出代码实例
Apr 02 #Javascript
webpack3.0升级4.0的方法步骤
Apr 02 #Javascript
Javascript模块化机制实现原理详解
Apr 02 #Javascript
sharp.js安装过程中遇到的问题总结
Apr 02 #Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 #jQuery
You might like
中国收音机工业发展史
2021/03/02 无线电
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
php pdo操作数据库示例
2017/03/10 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
JavaScript实现10秒后再次获取验证码
2020/12/02 Javascript
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
python实现多线程的两种方式
2016/05/22 Python
Python对List中的元素排序的方法
2018/04/01 Python
Python异常处理操作实例详解
2018/05/10 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
django queryset相加和筛选教程
2020/05/18 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
利用python 读写csv文件
2020/09/10 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
哈弗商学院毕业生求职信
2014/02/26 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
浅谈pytorch中的dropout的概率p
2021/05/27 Python