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 相关文章推荐
[HTML/CSS/Javascript]WWTJS
Sep 25 Javascript
JavaScript CSS修改学习第一章 查找位置
Feb 19 Javascript
基于Jquery的开发个代阴影的对话框效果代码
Jul 28 Javascript
浅谈javascript属性onresize
Apr 20 Javascript
JQuery实现样式设置、追加、移除与切换的方法
Jun 11 Javascript
BootStrap Typeahead自动补全插件实例代码
Aug 10 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
JS实现监控微信小程序的原理
Jun 15 Javascript
vue实现打印功能的两种方法
Sep 07 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
Sep 29 Javascript
JavaScript链式调用实例浅析
Dec 19 Javascript
JavaScript实现留言板案例
Mar 17 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下通过file_get_contents的代理使用方法
2011/02/16 PHP
PHP中设置时区方法小结
2012/06/03 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
php实现微信支付之现金红包
2018/05/30 PHP
jQuery实用基础超详细介绍
2013/04/11 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
简单了解django orm中介模型
2019/07/30 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
Django日志及中间件模块应用案例
2020/09/10 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
大专毕业生自我鉴定
2013/11/21 职场文书
钳工实训报告总结
2014/11/04 职场文书
校园安全教育心得体会
2016/01/15 职场文书
外出学习心得体会范文
2016/01/18 职场文书
高一作文之乐趣
2019/11/21 职场文书
创业计划书之酒吧
2019/12/02 职场文书
Python WSGI 规范简介
2021/04/11 Python
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript