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 相关文章推荐
ArrayList类(增强版)
Apr 04 Javascript
如何确保JavaScript的执行顺序 之实战篇
Mar 03 Javascript
javascript的几种继承方法介绍
Mar 22 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
Oct 13 Javascript
RequireJS 依赖关系的实例(推荐)
Jan 21 Javascript
js 获取图像缩放后的实际宽高,位置等信息
Mar 07 Javascript
深入理解Webpack 中路径的配置
Jun 17 Javascript
vue登录路由验证的实现
Dec 13 Javascript
微信小程序设置滚动条过程详解
Jul 25 Javascript
Vue3.x源码调试的实现方法
Oct 13 Javascript
js实现html滑动图片拼图验证
Jun 24 Javascript
Vue基于iview table展示图片实现点击放大
Aug 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 类自动载入的方法
2015/06/03 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
JS 判断代码全收集
2009/04/28 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
python编写的最短路径算法
2015/03/25 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
用python做游戏的细节详解
2019/06/25 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
英国团购网站:Groupon英国
2017/11/28 全球购物
创业者是否需要商业计划书?
2014/02/07 职场文书
《白鹅》教学反思
2014/04/13 职场文书
开展创先争优活动总结
2014/08/28 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书