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 相关文章推荐
解决jquery的datepicker的本地化以及Today问题
May 23 Javascript
jquery中通过父级查找进行定位示例
Jun 28 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
Apr 07 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 Javascript
JavaScript实现Java中Map容器的方法
Oct 09 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
Jan 21 Javascript
原生JS实现九宫格抽奖效果
Apr 01 Javascript
浅谈PDF.js使用心得
Jun 07 Javascript
vue项目中实现缓存的最佳方案详解
Jul 11 Javascript
JavaScript实现筛选数组
Mar 02 Javascript
JavaScript原型链中函数和对象的理解
Jun 16 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计算上一个月的今天
2013/05/23 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
详解如何较好的使用js
2016/12/16 Javascript
快速入门Vue
2016/12/19 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
vue路由中前进后退的一些事儿
2019/05/18 Javascript
python 排列组合之itertools
2013/03/20 Python
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
Python处理字符串之isspace()方法的使用
2015/05/19 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
python非递归全排列实现方法
2017/04/10 Python
Python探索之Metaclass初步了解
2017/10/28 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
PyQt5 多窗口连接实例
2019/06/19 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
Python如何给函数库增加日志功能
2020/08/04 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
Servlet面试题库
2015/07/18 面试题
测绘工程专业求职信
2014/07/15 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书