JavaScript中使用Async实现异步控制


Posted in Javascript onAugust 15, 2017

async官方DOC

介绍

node安装

npm install async --save

使用

var async = require('async')

js文件

github.com/caolan/asyn…

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中使用Async实现异步控制,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript AutoScroller 函数类
May 29 Javascript
js函数的延迟加载实现代码
Oct 11 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
Feb 22 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
Jan 26 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
Jun 12 Javascript
javascript实现连续赋值
Aug 10 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Dec 15 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
Dec 18 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
vue学习笔记之Vue中css动画原理简单示例
Feb 29 Javascript
实例分析javascript中的异步
Jun 02 Javascript
利用vue3+ts实现管理后台(增删改查)
Oct 30 Javascript
使用jQuery实现购物车结算功能
Aug 15 #jQuery
javascript兼容性(实例讲解)
Aug 15 #Javascript
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
Aug 14 #Javascript
JavaScript监听手机物理返回键的两种解决方法
Aug 14 #Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
Aug 14 #jQuery
js单页hash路由原理与应用实战详解
Aug 14 #Javascript
jQuery选择器特殊字符与属性空格问题
Aug 14 #jQuery
You might like
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
PHP类的封装与继承详解
2015/09/29 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
jquery 学习之一 对象访问
2010/11/23 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
js分页工具实例
2015/01/28 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
深入理解Python变量与常量
2016/06/02 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
物业管理个人自我评价
2013/11/08 职场文书
车贷收入证明范本
2014/01/09 职场文书
会议主持词
2014/03/17 职场文书
作风大整顿心得体会
2014/09/10 职场文书
内勤岗位职责
2015/02/10 职场文书
导游词之湖州-太湖
2019/10/11 职场文书