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 相关文章推荐
document 和 document.all 分别什么时候用
Jun 22 Javascript
浅析jQuery中常用的元素查找方法总结
Jul 04 Javascript
Checbox的操作含已选、未选及判断代码
Nov 07 Javascript
自己使用jquery写的一个无缝滚动的插件
Apr 30 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
jquery div模态窗口的简单实例
May 28 Javascript
浅谈js中的三种继承方式及其优缺点
Aug 10 Javascript
AngularJS日程表案例详解
Aug 15 Javascript
vue项目中v-model父子组件通信的实现详解
Dec 10 Javascript
JavaScript时间与时间戳的转换操作实例分析
Dec 07 Javascript
jquery实现拖拽小方块效果
Dec 10 jQuery
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批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
python使用webbrowser浏览指定url的方法
2015/04/04 Python
Python 处理数据的实例详解
2017/08/10 Python
Python实现一个简单的验证码程序
2017/11/03 Python
django 控制页面跳转的例子
2019/08/06 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
python实现拼图小游戏
2020/02/22 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
2014感恩节演讲稿大全
2014/10/11 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
JAVA springCloud项目搭建流程
2022/05/11 Java/Android