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 相关文章推荐
JScript的条件编译
May 29 Javascript
List Information About the Binary Files Used by an Application
Jun 11 Javascript
斜45度寻路实现函数
Aug 20 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
Nov 07 Javascript
javascript不同类型数据之间的运算的转换方法
Feb 13 Javascript
javascript轻量级模板引擎juicer使用指南
Jun 22 Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
Jun 12 Javascript
jQuery实现动态控制页面元素的方法分析
Dec 20 jQuery
Vue2 监听属性改变watch的实例代码
Aug 27 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
Sep 29 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
Aug 31 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调用Webservice实例代码
2011/07/29 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
Python中max函数用法实例分析
2015/07/17 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
深入理解Python 多线程
2020/06/16 Python
python中re模块知识点总结
2021/01/17 Python
linux面试题参考答案(9)
2016/01/29 面试题
党员干部公开承诺书
2014/03/26 职场文书
竞选文艺委员演讲稿
2014/04/28 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
党员发展大会主持词
2015/07/03 职场文书
部门主管竞聘书
2015/09/15 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS