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 相关文章推荐
点图片上一页下一页翻页效果
Jul 09 Javascript
JS版网站风格切换实例代码
Oct 06 Javascript
动态加载dtree.js树treeview(示例代码)
Dec 17 Javascript
JQuery 图片滚动轮播示例代码
Mar 24 Javascript
thinkphp 表名 大小写 窍门
Feb 01 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
jQuery自定义多选下拉框效果
Jun 19 jQuery
记一次webpack3升级webpack4的踩坑经历
Jun 12 Javascript
详解js加减乘除精确计算
Mar 19 Javascript
Vue中常用rules校验规则(实例代码)
Nov 14 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
Jul 28 Javascript
js面向对象方式实现拖拽效果
Mar 03 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操作符与控制结构代码
2011/12/30 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
python中threading开启关闭线程操作
2020/05/02 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
新闻网站实习自我鉴定
2013/09/25 职场文书
化学教师教学反思
2014/01/17 职场文书
数学检讨书1000字
2014/02/24 职场文书
科技工作者先进事迹
2014/08/16 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python