### 异步操作与async函数
* 异步与回调
* Promise
* Generator
* Thunk
* async
* * * * *
#### 异步与回调
> 注:“本文档主要在于讲解异步操作的终极方案 async ,其他的方法和案例都只为理解async做铺垫”
> 所谓的“异步”,就是把一个任务分为两段去执行,先执行第一段,然后转而执行其他任务,等第一段任务执行好之后再回头执行第二段,之后再去执行其他任务。举个例子:
> 小明每天下班回家,先点外卖,再打开洗衣机洗衣服,然后外卖到了先吃饭,吃完饭去晾衣服。
> 上面的例子就是一个异步,如果将上面的异步转为同步,流程如下:
> 小明每天下班回家,先点外卖,等待外卖到了之后吃饭,然后打开洗衣机洗衣服,然后等洗衣机洗好衣服后晾衣服。
> 上面两种例子阐述了异步与同步的概念,异步就是执行没个任务都不需要等待满足某个特定条件,而同步,则需要在某个事情完整的执行完成后才能执行下一个事情
> 所谓“回调函数”,又是何物?回调函数就是把异步任务的第二段,单独写入一个函数,等到重新执行该任务时直接调用这个函数。
#### Promise
> 回调函数本身没有问题,只是在使用过程中由于业务逻辑变的复杂,回调函数通常都是很多个嵌套在一起,乱成一团,很难管理,这种情况称为“回调地狱”(callback hell),如:
~~~
fs.readfile(a,function(err,data){
fs.readfile(b,function(err,data){
.....
})
})
~~~
> Promise就是为了解决这种问题而生,它不是一种新语法,只是一种新写法,能将横向价值的回调函数改写为纵向加载,如:
~~~
fs.readfile(file)
.then(function(data){
console.log(data);
})
.then(function(data){
console.log(data);
})
.catch(function(err){
console.log(err);
});
~~~
> Promise提供了then方法加载回调函数,catch方法捕捉执行过程中抛出的错误,在使用Promise后,每段任务看的更清楚了,而最大的问题就是随着业务逻辑的增加代码变的臃肿了,一眼看去全是then,那么有没有其他方法呢?
#### Generator
> Generator是ES6中实现的一个协程,最大的特点就是可以暂停函数执行