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中this关键字的一些小知识
Mar 15 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
js流动式效果显示当前系统时间
May 16 Javascript
JS Ajax请求如何防止重复提交
Jun 13 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
Jun 09 Javascript
JS实现自定义状态栏动画文字效果示例
Oct 12 Javascript
Javascript中从学习bind到实现bind的过程
Jan 05 Javascript
vue keep-alive请求数据的方法示例
May 16 Javascript
vuex提交state&&实时监听state数据的改变方法
Sep 16 Javascript
vue实现div拖拽互换位置
Jul 29 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
js实现简单图片拖拽效果
Feb 22 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
动态加载iframe
2006/06/16 Javascript
Prototype使用指南之selector.js
2007/01/10 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
js倒计时小程序
2013/11/05 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
vue2.x数组劫持原理的实现
2020/04/19 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
Python网站验证码识别
2016/01/25 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
python实现自主查询实时天气
2018/06/22 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
Mankind西班牙男士护肤品网站:购买皮肤护理、护发和剃须
2017/04/27 全球购物
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
写给老师的表扬信
2014/01/21 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
小学六一主持词开场白
2015/05/28 职场文书
详细了解java监听器和过滤器
2021/07/09 Java/Android