bash脚本语言,基本上每个命令都是需要不定时等待的,所以是一种天然的异步流程控制语言
“我们要寻找的就是如何组织我们的代码,来让其更加容易,极少冗余的表述我们的思维过程,同时这个过程本身又是容易被不断延展的,我称之为编织代码。”
表面同步,内在异步的模型,才是高并发编程和高效率编程的最终方案
概念
流程
由两个及以上的业务步骤,完成一个完整的业务行为的过程,可称之为流程;注意是两个及以上的业务步骤
简言之流程就是过程节点及执行方式有序组成的过程。
异步
异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送
线程
线程是进程中某个单一顺序的控制流。也被称为轻量进程(lightweight processes).计算机科学术语,指运行中的程序的调度单位
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者
流程控制
在声明式的编程语言中,流程控制指令是指会改变程序运行顺序的指令,可能是运行不同位置的指令,或是在二段(或多段)程序中选择一个运行。
目的:规定程序执行的顺序
流程控制可分为三类:
- 第一个是顺序执行。这个非常简单,就是先执行第一行再执行第二行……这样依次从上往下执行。
- 第二个是选择执行。也就是说,有些代码可以跳过不执行,有选择地执行某些代码。
- 第三个是循环执行。也就是说,有些代码会反复执行。
代码
定义一个异步的加法函数
// 使用promise
function asyncAdd(a, b) {
return new Promise((resolve, reject) => {
if (typeof a !== 'number' || typeof b !== 'number') {
return reject('arguments type wrong!')
}
setTimeout(() => {
resolve(a + b)
}, 50)
})
}
// 使用callback
function callbackAdd(a, b, cb) {
if (typeof cb !== 'function') {
throw new Error('arguments:cb must be function')
}
if (typeof a !== 'number' || typeof b !== 'number') {
return cb('arguments type wrong!')
}
setTimeout(() => {
cb(null, a + b)
}, 50)
}
要求:使用asyncAdd方法,执行从1…100的循环操作
方案0:传统的callback
语法
console.time('callback 100')
callbackAdd(1, 2, (err, result) => {
if (err) {
throw new Error(err