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 相关文章推荐
摘自启点的main.js
Apr 20 Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
Mar 16 Javascript
js中根据字数截取字符串,不能截断url
Jan 12 Javascript
JSON辅助格式化处理方法
Mar 26 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
May 17 Javascript
javascript顺序加载图片的方法
Jul 18 Javascript
遍历json 对象的属性并且动态添加属性的实现
Dec 02 Javascript
微信小程序 Buffer缓冲区的详解
Jul 06 Javascript
JS严格模式知识点总结
Feb 27 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
Vuex的初探与实战小结
Nov 26 Javascript
Vue动态创建注册component的实例代码
Jun 14 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
为超链接加上disabled后的故事
2010/12/10 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
Django如何实现内容缓存示例详解
2017/09/24 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
信息管理专业推荐信
2013/10/29 职场文书
工程承诺书怎么写
2014/05/24 职场文书
毕业生应聘求职信
2014/07/10 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
教师三严三实心得体会
2014/10/11 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书