如何用 async 控制流程
来自: http://larry850806.github.io/2016/05/31/async/
[Javascript] 如何用 async 控制流程 (一)
31 May 2016
async
async 是一個 Node.js module
也可以在前端的 javascript 中直接使用
讓 code 更好看也更好 debug
在 Node.js 中
npm install async
var async = require('async');
在前端 javascript 中
<script type="text/javascript" src="https://rawgit.com/caolan/async/master/dist/async.min.js"></script>
callback
因為 javascript 特有的 callback
callback 用多了你的 code 就會長這樣
Google Callback 地獄
缺點:
- code 有好幾層很醜
- 很難 debug
- 要看很久才能看懂
所以就有了 async
專門在處理這些 asynchronous 的 callback
async.waterfall
使用時機 :
fun2 需要 fun1 callback 的資料
fun3 又需要 fun2 callback 的資料
最後的結果又需要 fun3 callback 的資料
如果 function 更多的話會再疊上去
func1(function(err1, result1){
if(err1) throw err1;
func2(result1, function(err2, result2, result3){
if(err2) throw err2;
func3(result2, result3, function(err3, result4){
if(err3) throw err3;
console.log(result4);
});
});
});
如果用 async
// waterfall 會按照順序執行 function
// 而且可以傳參數
async.waterfall([
function(next){
func1(function(err1, result1){
next(err1, result1);
// 用 next 把參數傳到下一個 function
// 把 result1 放到下面的 rst1
});
},
function(rst1, next){
func2(rst1, function(err2, result2){
next(err2, result2, result3);
// 把 result2 放到下面的 rst2
// 把 result3 放到下面的 rst3
});
},
function(rst2, rst3, next){
func3(rst2, rst3, function(err3, result4){
next(err3, result4);
// 把 result4 放到下面的 rst (因為 fun3 是最後一個了)
});
}
], function(err, rst){
if(err) throw err; // 匯集 err1 err2 err3
console.log(rst); // 收到的 rst = 上面的 result4
});
用 waterfall 不會讓你的 callback 越疊越高
而且可以匯集 error 一併處理
不用在每個 callback 內確認 error
async.series
使用時機 :
fun2 不需要 fun1 callback 的資料
fun3 也不需要 fun2 callback 的資料
但最後的結果要把 fun1 fun2 fun3 的資料整合起來
var allResults = []; // new array
func1(function(err1, result1){
if(err1) throw err1;
allResults.push(result1);
func2(function(err2, result2){
if(err2) throw err2;
allResults.push(result2);
func3(function(err3, result3){
if(err3) throw err3;
allResults.push(result3);
console.log(allResults);
// allResults = [result1, result2, result3]
});
});
});
如果用 async
// series 會按照順序執行 function
// 而且可以把結果全部彙整起來
async.series([
function(next){
func1(function(err1, result1){
next(err1, reuslt1);
});
},
function(next){
func2(function(err2, result2){
next(err2, reuslt2);
});
},
function(next){
func3(function(err3, result3){
next(err3, reuslt3);
});
}
], function(errs, results){
if(errs) throw errs; // errs = [err1, err2, err3]
console.log(results); // results = [result1, result2, result3]
});
可以很方便的彙整資料
也不用多宣告一個 results
async.parallel
使用時機 :
fun1, fun2, fun3 平行執行
將執行的結果整合起來
與 series 不同的是
parallel 的多個 function 會同時執行
所以不能互相衝突(存取相同檔案…等等)
async.parallel([
function(finish){
fun1(function(err1, rst1){
finish(err1, rst1);
// 完成所有動作後 finish
});
},
function(finish){
fun1(function(err2, rst2){
finish(err2, rst2);
});
},
function(finish){
fun1(function(err3, rst3){
finish(err3, rst3);
});
}
], function(errs, results){
if(errs) throw errs; // errs = [err1, err2, err3]
console.log(results); // results = [result1, result2, result3]
});
parallel 跟 series 滿像的都是把結果整合起來
但因為是平行效率比較高
但是要小心不要衝突
基本的 async 介紹就到這裡
希望大家看完這篇有比較了解 async 在幹嘛 ~
要看更進階的功能可以到他們的 GitHub
這是第二篇
[JavaScript] 如何用 async 控制流程 (二)
會介紹一些比較難的流程控制
如何用 async 控制流程的更多相关文章
- async 异步流程控制规则
github 学习async网址 : https://github.com/caolan/async/ 1.Async 函数介绍 async 主要实现了三个部分的流程控制功能 1.集合:Collect ...
- MySQL数据库学习笔记(四)----MySQL聚合函数、控制流程函数(含navicat软件的介绍)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL聚合函数、控制流程函数(含navicat软件的介绍)
MySQL聚合函数.控制流程函数(含navicat软件的介绍) 一.navicat的引入:(第三方可视化的客户端,方便MySQL数据库的管理和维护) NavicatTM是一套快速.可靠并价格相宜的数据 ...
- JavaScript(三)---- 控制流程语句
常用的控制流程语句有判断语句.分支语句.循环语句.基本用法都和java中的一致,switch有几点特殊. 1.判断语句 格式: if(判断条件){ 符合条件执行的代 ...
- 【JAVA零基础入门系列】Day8 Java的控制流程
什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...
- Java基础语法<四> 控制流程
笔记整理 来源于<Java核心技术卷 I > <Java编程思想> if while do while for switch case case标签可以是: 类型为ch ...
- MySQL 聚合函数 控制流程函数
常用的聚合函数 1. AVG() 求平均值 mysql> AVG([DISTINCT] expr) -- 返回 expr 的平均值 mysql> select AVG(age) from ...
- 第三节:带你详解Java的操作符,控制流程以及数组
前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...
- Java入门(五):控制流程
在Java中,使用条件语句和循环结构确定控制流程,在本文中,主要包括块作用域.条件语句.循环结构.中断循环这四部分. 一.块作用域 块,也叫复合语句,是指由一对大括号括起来的若干条Java语句.块决定 ...
随机推荐
- Yahoo的Yslow23条规则
一. CONTENT 减少使用HTTP请求(Minimize HTTP Requests) 通常打开一个页面的时候,大部分的时间都是在下载该页面的图片,css样式,js脚本,flash等等资源,减少这 ...
- 【转】crontab实用手册
前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...
- 2017-2018-2 20155309 南皓芯 Exp5 MSF基础应用
实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; 1.2 一个针对浏览器的攻击,如ms11_05 ...
- CentOS 上安装 nodejs v11.0.0
下载 nodejs 淘宝 nodejs 镜像地址:https://npm.taobao.org/mirrors/node wget 命令下载: wget https://npm.taobao.org/ ...
- 2018-2019-2 网络对抗week1 Kali安装 20165333陈国超
Kali安装 安装过程是按照网上的教程装的,链接点击[https://blog.csdn.net/KNIGH_YUN/article/details/79949512] 安装成功的截图 主要说一下安装 ...
- 《剑指offer》-数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 最开始的思路 ...
- Hibernate的核心对象关系映射
Hibernate的核心就是对象关系映射: 加载映射文件的两种方式: 第一种:<mapping resource="com/bie/lesson02/crud/po/employee. ...
- [ZJOI2012]数列
超级水的题还wa了一次 首先很容易发现其实就只有两个值并存 然后 要注意把数组初始化啊...可能后面有多余的元素(对拍的时候由于从小到大就没跑出错) #include <bits/stdc++. ...
- 记录weiye项目上线遇到的一些问题
1.使用vpn访问客户内网 参考:http://jingyan.baidu.com/article/a3f121e4f9903cfc9052bb0b.html 2.设置使用ip地址直接访问项目(之后可 ...
- Java jvm 内存参数限制
nohup java -jar -Xms3g -Xmx3g jenkins.war > jenkins.log 2>&1 &