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 相关文章推荐
实现超用户体验 table排序javascript实现代码
Jun 22 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
Jun 21 Javascript
jquery比较简洁的软键盘特效实现方法
Mar 19 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
Apr 20 Javascript
JavaScript禁止用户多次提交的两种方法
Jul 24 Javascript
原生js实现手风琴功能(支持横纵向调用)
Jan 13 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
Aug 22 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
vue实现简单瀑布流布局
May 28 Javascript
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
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
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
JS验证字符串功能
2017/02/22 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
Python写的一个简单DNS服务器实例
2014/06/04 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
python regex库实例用法总结
2021/01/03 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
物流经理自我评价
2013/09/23 职场文书
环境科学专业研究生求职信
2013/10/02 职场文书
家长评语大全
2014/01/22 职场文书
新年爱情寄语
2014/04/08 职场文书
十佳护士先进事迹
2014/05/08 职场文书
办理护照工作证明
2014/10/10 职场文书
2015新年寄语大全
2014/12/08 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
汉字听写大会观后感
2015/06/12 职场文书
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python
Golang入门之计时器
2022/05/04 Golang