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 相关文章推荐
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
读jQuery之四(优雅的迭代)
Jun 20 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
时间戳转换为时间 年月日时间的JS函数
Aug 19 Javascript
Javascript Ajax异步读取RSS文档具体实现
Dec 12 Javascript
jQuery实现的简洁下拉菜单导航效果代码
Aug 26 Javascript
全面解析Bootstrap弹窗的实现方法
Dec 01 Javascript
javascript之IE版本检测超简单方法
Aug 20 Javascript
Vue.js学习示例分享
Feb 05 Javascript
vue :src 文件路径错误问题的解决方法
May 15 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
Aug 08 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 strcmp使用说明
2010/04/22 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
django2笔记之路由path语法的实现
2019/07/17 Python
Python continue语句实例用法
2020/02/06 Python
Python中求对数方法总结
2020/03/10 Python
python 日志 logging模块详细解析
2020/03/31 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
党员年终民主评议的自我评价
2013/11/05 职场文书
求职信的要素有哪些呢
2013/12/26 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
检讨书范文
2015/01/27 职场文书
办公室禁烟通知
2015/04/23 职场文书
2015年教务工作总结
2015/05/23 职场文书
幼儿园2016年圣诞活动总结
2016/03/31 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
用Python将库打包发布到pypi
2021/04/13 Python