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 相关文章推荐
javascript应用:Iframe自适应其加载的内容高度
Apr 10 Javascript
JQuery datepicker 使用方法
May 20 Javascript
IFrame跨域高度自适应实现代码
Aug 16 Javascript
JavaScript省市联动实现代码
Feb 15 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
Mar 05 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
May 23 Javascript
jquery中的常见问题及快速解决方法小结
Jun 14 Javascript
简单实现IONIC购物车功能
Jan 10 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
Jun 28 jQuery
记录一次开发微信网页分享的步骤
May 07 Javascript
JS实现时间校验的代码
May 25 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
Sep 12 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文件操作实例代码
2012/05/10 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
js实现上传图片预览的方法
2015/02/09 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
python采集博客中上传的QQ截图文件
2014/07/18 Python
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
Python中的自定义函数学习笔记
2014/09/23 Python
Python函数返回不定数量的值方法
2019/01/22 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
int和Integer有什么区别
2013/05/25 面试题
跟单文员岗位职责
2014/01/03 职场文书
初中美术教学反思
2014/01/29 职场文书
销售助理岗位职责
2014/02/21 职场文书
小学运动会班级口号
2014/06/09 职场文书
委托书怎样写
2014/08/30 职场文书
新教师培训心得体会
2014/09/02 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
无线电知识基础入门篇
2022/02/18 无线电
java开发双人五子棋游戏
2022/05/06 Java/Android
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers