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 图片切换插件(代码比较少)
May 07 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
Dec 11 Javascript
详解JavaScript UTC时间转换方法
Jan 07 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
Jun 02 Javascript
javaScript中定义类或对象的五种方式总结
Dec 04 Javascript
Javascript Function.prototype.bind详细分析
Dec 29 Javascript
canvas简单快速的实现知乎登录页背景效果
May 08 Javascript
jquery版轮播图效果和extend扩展
Jul 18 jQuery
使用vue-cli脚手架工具搭建vue-webpack项目
Jan 14 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
Feb 21 Javascript
微信小程序登录数据解密及状态维持实例详解
May 06 Javascript
解决vue自定义指令导致的内存泄漏问题
Aug 04 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
删除无限级目录与文件代码共享
2006/07/12 PHP
用Zend Encode编写开发PHP程序
2006/10/09 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
python list转矩阵的实例讲解
2018/08/04 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
Python交互式图形编程的实现
2019/07/25 Python
python3图片文件批量重命名处理
2019/10/31 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
大学生护理专业自荐信
2013/10/03 职场文书
心得体会怎么写
2013/12/30 职场文书
商业融资计划书
2014/04/29 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
好员工观后感
2015/06/17 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android