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 相关文章推荐
Cookie 注入是怎样产生的
Apr 08 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
jquery实现metro效果示例代码
Sep 06 Javascript
用jquery.sortElements实现table排序
May 04 Javascript
JQuery 使用attr方法实现下拉列表选中
Oct 13 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
Apr 20 Javascript
浅谈JavaScript 标准对象
Jun 02 Javascript
Vue过滤器的用法和自定义过滤器使用
Feb 08 Javascript
Angular.js中下拉框实现渲染html的方法
Jun 18 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
Aug 15 jQuery
vue-lazyload使用总结(推荐)
Nov 01 Javascript
基于vue-draggable 实现三级拖动排序效果
Jan 10 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/10/09 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
2014/06/22 PHP
PHP 接入微信扫码支付总结(总结篇)
2016/11/03 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
jQuery 工具函数学习资料
2010/04/29 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
Jquery中给animation加更多的运作效果实例
2013/09/05 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
python解析json实例方法
2013/11/19 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
详解用python生成随机数的几种方法
2019/08/04 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
五一劳动节活动记录
2014/03/23 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
幼儿园辞职信
2015/05/13 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python
MySQL插入数据与查询数据
2022/03/25 MySQL