针对JS的异步机制,JS社区给出了很多不同的解决方案,Async库便是其中一种,可能也是对于控制异步操作最全面的资源。因为该库提供了70个函数,几乎想所有的运用场景都考虑在内。以下笔者针对四个函数进行讲解:

1. parallel

const async = require('async');const doOne = callback => {setTimeout(() => {callback(null, 'one');}, 1000)
}const doTwo = callback => {setTimeout(() => {callback(null, 'two');}, 1000)
}let array = [];
array.push(doOne);
array.push(doTwo);async.parallel(array, (err, result) => {console.log(result);
})//等待1秒后打印:['one', 'two']

Parallel 函数接受两个参数,第一个参数可以是数组也可以是对象。里边需要包括所有需要并行操作的异步函数,以上图为例,笔者将两个异步函数,setTimeout加入队列中,然后放入parallel函数内的第一个参数。需要注意的是每个异步函数需要制定一个固定参数callback进行调用。该函数用来检测任何错误信息和最后传达到parallel第二个参数的result。以上函数的执行结果是在等待一秒之后打印出队列,里面包含了‘one’和'two'两值。如果将以上的array改成一个对象,那result也会是一个对象,并根据传入的键值给结果附上对应的值。

2. series

const async = require('async');const doOne = callback => {setTimeout(() => {callback(null, 'one');}, 1000)
}const doTwo = callback => {setTimeout(() => {callback(null, 'two');}, 1000)
}let array = [];
array.push(doOne);
array.push(doTwo);async.series(array, (err, result) => {console.log(result);
})//等待2秒后打印:['one', 'two']

以上的代码和parallel几乎一样,唯一改变的是将parallel函数改成series。但执行结果却从1秒变为2秒。Series针对数组的顺序去调用异步函数,只有当第一个函数执行完成后才会调用第二个,所以执行时间会延长到2秒。但一般情况下,如果业务逻辑需要几个异步操作通过顺序进行,那么很有可能排后的函数需要用到先执行函数的结果,而series并没有给出传递参数给下一个函数的功能。在这样的情况,开发者可以用waterfall来解决;

3. waterfall

const doOne = callback => {callback(null, "one");
}const doTwo = (arg, callback) => {console.log(arg);callback(null, "two");
}let array = [];
array.push(doOne);
array.push(doTwo);async.waterfall(array, (err, result) => {console.log(result);
})//one
//two

跟其他函数不同waterfall会将数组里第一个函数传入callback的值传递给下一个函数。doTwo里面的console.log会打印doOne传入的“one”,而waterfall里的回调会打印doTwo传入的“two”。

4. whilst

var count = 0;
async.whilst(function() { return count < 10; },function(callback) {count++;console.log(count);setTimeout(function() {callback(null, count);}, 500);},function (err, n) {console.log('done');}
);

whilst跟以上三个函数不同,该操作不是针对数组或者对象内的顺序进行异步调用,而是针对在某种条件下执行异步操作。whilst接受三个参数,第一个为判断函数,只有在该函数返回true时,第二个参数参会执行。第二个参数便是表达核心逻辑的函数。第三个则是第一个参数返回false之后的回调函数。在上面的例子中,whilst控制住了count的打印速度,会在每半秒打印出一次count。

JS async库:parallel, series, waterfall, whilst用法相关推荐

  1. node.js async循环数组的方法

    Collections 集合处理 async.forEachOf  |  eachOf(object, iterator, callback) 实现功能:遍历object对象执行iterator,报错 ...

  2. js折线图设置y轴刻度_手绘风格的 JS 图表库:Chart.xkcd

    本文作者:HelloGitHub-kalifun 图表库千万个今天 HelloGitHub 给大家推荐个很有"特色"的图表库:一个手绘风格的 JS 图表库 -- Chart.xkc ...

  3. extjs chart无法在panel中显示_手绘风格的 JS 图表库:Chart.xkcd

    本文作者:HelloGitHub-kalifun 图表库千万个今天 HelloGitHub 给大家推荐个很有"特色"的图表库:一个手绘风格的 JS 图表库 -- Chart.xkc ...

  4. python中mean的用法_python 的numpy库中的mean()函数用法介绍

    1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=)[source] Compute the arithm ...

  5. 手绘风格的 JS 图表库:Chart.xkcd

    本文作者:HelloGitHub-kalifun 图表库千万个今天 HelloGitHub 给大家推荐个很有"特色"的图表库:一个手绘风格的 JS 图表库 -- Chart.xkc ...

  6. 10个常用的JS工具库

    10个常用的JS工具库,80%的项目都在用! Avue Cloud 2022-01-26 09:46 图片 高手区别于普通人的重要一点是,他们善于利用工具,把更多的时间留给了规划和思考.写代码也是同样 ...

  7. python 的numpy库中的mean()函数用法介绍

    这篇文章主要介绍了python 的numpy库中的mean()函数用法介绍,具有很好对参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 mean() 函数定义: 2 mean()函数功能: 求取均 ...

  8. 浅谈js开源库jQuery

    文章目录 0 前言 1 jQuery 核心函数 2 jQuery 对象和 dom 对象 3 jQuery 选择器 4 DOM 的增删改 5 jQuery 的属性操作 6 jQuery 事件操作 7.封 ...

  9. 当前最流行的 js 工具库

    高手区别于普通人的重要一点是,他们善于利用工具,把更多的时间留给了规划和思考.写代码也是同样的道理,工具用好了,你就有更多的时间来规划架构和攻克难点.今天就给大家分享一下当前最流行的 js 工具库,如 ...

  10. Raphael Js矢量库API简介:

    Raphael Js矢量库API简介: Raphael Javascript 是一个 Javascript的矢量库. 2010年6月15日,著名的JavaScript库ExtJS与触摸屏代码库项目jQ ...

最新文章

  1. Ansible基础一Playbook(二)
  2. 最新最全GPT-3模型网络结构详细解析
  3. IT职场中外企面试最爱提的问题TOP10
  4. 阿里2020 净利润约: 2000亿元 腾讯2020 净利润约: 1000亿元 百度2020 净利润约: 300亿元 美团2020 净利润约: 150亿元 --互联网一响,黄金万两
  5. 以某个字符开始_小白从零开始数据分析01—Excel常用公式汇总(数据清洗)
  6. android源码包下载
  7. linux activemq 日志,log4j通过ActiveMQ远程记录日志设计配置
  8. 将数所有奇数移到数组前java_全国2014年4月自考Java语言程序设计(一)真题
  9. windows操作系统原理_操作系统 — 深入理解内存的原理
  10. Java中的Servlet详解
  11. 14种最佳的PHP帮助台脚本和5种免费选项
  12. 天涯宝盒-天涯看贴脚本-只看楼主-自动翻页
  13. volatile 与诡异事件
  14. iOS开发 frame与bounds
  15. 创业融资路演PPT模板
  16. git commit三种回退的方式
  17. python 股票交易接口 github_GitHub - Higgsbit/vnpy: 基于python的开源交易平台开发框架...
  18. 一世英雄一世尘 - 读《金庸传》
  19. linux虚拟机安装过程中卡在mount: block device /dev/sr0 is write-protected, mounting read-only
  20. Java架构师面试必备题(含答案)

热门文章

  1. RouterOS o*** client 连接爱快 Open*** 服务端
  2. matlab制作图片显示器,自己动手做一个雷达PPI显示器的动态效果图(附Matlab代码)...
  3. LICEcap 简洁易用的动画屏幕录制软件
  4. 使用JS监听键盘按下事件
  5. 104 自定义大头针
  6. 【OHOS】常用命令整理
  7. 为什么我的背景图片加载不出来
  8. 关于Data Matrix 基于ECC200标准的编码原理和相关开源代码
  9. ddl是什么意思网络语_大学赶ddl是什么意思?DDL语句有什么功能?
  10. oracle11g 测试io,IO性能测试 1:Oracle ORION