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入门之对象与JSON详解
Oct 21 Javascript
JavaScript prototype属性深入介绍
Nov 27 Javascript
js获取input标签的输入值实现代码
Aug 05 Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 Javascript
js编写当天简单日历效果【实现代码】
May 03 Javascript
详解JavaScript跨域总结与解决办法
Oct 31 Javascript
基于JS实现网页中的选项卡(两种方法)
Jun 16 Javascript
从零开始搭建一个react项目开发
Feb 09 Javascript
使用vue-cli编写vue插件的方法
Feb 26 Javascript
JS通过识别id、value值对checkbox设置选中状态
Feb 19 Javascript
vue基于Teleport实现Modal组件
May 31 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 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实现的替换敏感字符串类实例
2014/09/22 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
Javascript调用C#代码
2011/01/17 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
详解Vue中watch的详细用法
2018/11/28 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
使用Python实现一个简单的项目监控
2015/03/31 Python
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
python基于win32api实现键盘输入
2020/12/09 Python
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
人力资源作业细则
2014/03/03 职场文书
公司贷款承诺书
2014/05/30 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
党建工作整改措施
2014/10/28 职场文书
给医院的感谢信
2015/01/21 职场文书
小学少先队活动总结
2015/05/08 职场文书
学校体育节班级口号
2015/12/25 职场文书
Python可视化神器pyecharts绘制水球图
2022/07/07 Python