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中各种编码解码函数的区别和注意事项
Aug 19 Javascript
JS如何将UTC格式时间转本地格式
Sep 04 Javascript
jquery禁用右键单击功能屏蔽F5刷新
Mar 17 Javascript
函数式 JavaScript(一)简介
Jul 07 Javascript
AngularJS实现元素显示和隐藏的几个案例
Dec 09 Javascript
js实现商城星星评分的效果
Dec 29 Javascript
js去字符串前后空格的实现方法
Feb 26 Javascript
vue.js加载新的内容(实例代码)
Jun 01 Javascript
通过js动态创建标签,并设置属性方法
Feb 24 Javascript
原生JS进行前后端同构
Apr 22 Javascript
ES6顶层对象、global对象实例分析
Jun 14 Javascript
layui的面包屑或者表单不显示的解决方法
Sep 05 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
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
jqTransform美化表单
2015/10/10 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
Django验证码的生成与使用示例
2017/05/20 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
国家励志奖学金获奖感言
2014/01/09 职场文书
竞职演讲稿范文
2014/01/11 职场文书
捐赠仪式主持词
2014/03/19 职场文书
颐和园的导游词
2015/01/30 职场文书
试了下Golang实现try catch的方法
2021/07/01 Golang
关于python爬虫应用urllib库作用分析
2021/09/04 Python