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技术很烂的五个原因
Apr 26 Javascript
Javascript中正则表达式的全局匹配模式分析
Apr 26 Javascript
jquery 年会抽奖程序
Dec 22 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
Apr 26 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
Jul 16 Javascript
js限制checkbox选中个数以限制六个为例
Jul 15 Javascript
node.js中的fs.stat方法使用说明
Dec 16 Javascript
node.js操作mysql(增删改查)
Jul 24 Javascript
ng-alain表单使用方式详解
Jul 10 Javascript
Vue最新防抖方案(必看篇)
Oct 30 Javascript
uni-app使用微信小程序云函数的步骤示例
May 22 Javascript
JavaScript语句错误throw、try及catch实例解析
Aug 18 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
php实用代码片段整理
2016/11/12 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
JS 控制CSS样式表
2009/08/20 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
JS解析XML实例分析
2015/01/30 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
Vuex模块化应用实践示例
2020/02/03 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python Series从0开始索引的方法
2018/11/06 Python
在python中pandas的series合并方法
2018/11/12 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
经管应届生求职信范文
2014/05/18 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle
Rust中的Struct使用示例详解
2022/08/14 Javascript
css弧边选项卡的项目实践
2023/05/07 HTML / CSS