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 相关文章推荐
jQuery select的操作实现代码
May 06 Javascript
JS比较两个时间大小的简单示例代码
Dec 20 Javascript
6种javascript显示当前系统时间代码
Dec 01 Javascript
详解Angular的数据显示优化处理
Dec 26 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
javaScript嗅探执行神器-sniffer.js
Feb 14 Javascript
微信小程序 在线支付功能的实现
Mar 14 Javascript
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
vue解决一个方法同时发送多个请求的问题
Sep 25 Javascript
详解ES6 Fetch API HTTP请求实用指南
Nov 14 Javascript
javascript实现弹幕墙效果
Nov 28 Javascript
JS实现前端路由功能示例【原生路由】
May 29 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操作xml
2013/10/27 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
原生js实现验证码功能
2017/03/16 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
Python文件处理
2016/02/29 Python
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
深入解析神经网络从原理到实现
2019/07/26 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
供电工程专业求职信
2014/08/09 职场文书
自主招生自荐信格式
2015/03/04 职场文书
校园安全主题班会
2015/08/12 职场文书
禁毒主题班会教案
2015/08/14 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android