来自: 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 控制流程的更多相关文章

  1. async 异步流程控制规则

    github 学习async网址 : https://github.com/caolan/async/ 1.Async 函数介绍 async 主要实现了三个部分的流程控制功能 1.集合:Collect ...

  2. MySQL数据库学习笔记(四)----MySQL聚合函数、控制流程函数(含navicat软件的介绍)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. MySQL聚合函数、控制流程函数(含navicat软件的介绍)

    MySQL聚合函数.控制流程函数(含navicat软件的介绍) 一.navicat的引入:(第三方可视化的客户端,方便MySQL数据库的管理和维护) NavicatTM是一套快速.可靠并价格相宜的数据 ...

  4. JavaScript(三)---- 控制流程语句

    常用的控制流程语句有判断语句.分支语句.循环语句.基本用法都和java中的一致,switch有几点特殊. 1.判断语句 格式:        if(判断条件){            符合条件执行的代 ...

  5. 【JAVA零基础入门系列】Day8 Java的控制流程

    什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...

  6. Java基础语法<四> 控制流程

    笔记整理 来源于<Java核心技术卷 I > <Java编程思想>   if while do while for   switch case case标签可以是: 类型为ch ...

  7. MySQL 聚合函数 控制流程函数

    常用的聚合函数 1. AVG() 求平均值 mysql> AVG([DISTINCT] expr) -- 返回 expr 的平均值 mysql> select AVG(age) from ...

  8. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...

  9. Java入门(五):控制流程

    在Java中,使用条件语句和循环结构确定控制流程,在本文中,主要包括块作用域.条件语句.循环结构.中断循环这四部分. 一.块作用域 块,也叫复合语句,是指由一对大括号括起来的若干条Java语句.块决定 ...

随机推荐

  1. appium自动化测试之元素定位

    方法一 使用SDK中附带的uiautomatorviewer来定位 在SDK安装目录下的tools下有个uiautomatorviewer.bat批处理文件点击运行 运行后(注意appium desk ...

  2. vue组件库(五):icon管理

    图标管理 前言 一.常用图标库网站 1.http://icomoon.io 阿里巴巴矢量图 身边的 2.http://fontawesome.dashgame.com iconmoon 3.http: ...

  3. 求next数组的两种方法

    法一解释:转自http://www.cnblogs.com/yjiyjige/p/3263858.html 关键运算步骤 i 0 1 2 3 4 5 6 7 8 9 A B A C D A B A B ...

  4. 《剑指offer》-递增数组中找到和为S的(最小)两个元素

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 首先 ...

  5. 《剑指offer》-铺地砖方案数

    我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 又是斐波那契...稍微变形一下. class Solution { pub ...

  6. HTTP请求报文和响应报文

    HTTP请求报文 GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User ...

  7. Linux下apache支持PHP配置

    https://www.cnblogs.com/qiuxiao/p/6815350.html https://www.cnblogs.com/polestar/p/6086552.html

  8. python全栈开发day13-迭代器、生成器、列表推导式等

    昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...

  9. MSF《构建之法》阅读笔记5

    第七章 MSF MSF是一种软件开发方法,MSF原则包括1推动信息共享和沟通,2为共同的远景而工作,3充分授权和信任,4各司其职,对项目共同负责,5交付增量的价值,6保持敏捷,预期和适应变化,7投资质 ...

  10. 【noip模拟赛5】任务分配 降维dp

    描述 现有n个任务,要交给A和B完成.每个任务给A或给B完成,所需的时间分别为ai和bi.问他们完成所有的任务至少要多少时间. 输入 第一行一个正整数n,表示有n个任务.接下来有n行,每行两个正整数a ...