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 相关文章推荐
用JS剩余字数计算的代码
Jul 03 Javascript
实现JavaScript中继承的三种方式
Oct 16 Javascript
jQuery中bind()方法用法实例
Jan 19 Javascript
js获取域名的方法
Jan 27 Javascript
js创建数组的简单方法
Jul 27 Javascript
js实现点击图片自动提交action的简单方法
Oct 16 Javascript
JS实现的RGB网页颜色在线取色器完整实例
Dec 21 Javascript
JS模拟超市简易收银台小程序代码解析
Aug 18 Javascript
canvas基础绘制-绚丽倒计时的实例
Sep 17 Javascript
vue脚手架中配置Sass的方法
Jan 04 Javascript
ES6 系列之 Generator 的自动执行的方法示例
Oct 19 Javascript
JS 5种遍历对象的方式
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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
Python实现约瑟夫环问题的方法
2016/05/03 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
对python sklearn one-hot编码详解
2018/07/10 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
计算机专业学生求职信分享
2013/12/15 职场文书
老公给老婆的道歉信
2014/01/10 职场文书
超市开学活动方案
2014/03/01 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
卫生保健工作总结2015
2015/05/18 职场文书