### 异步操作与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中实现的一个协程,最大的特点就是可以暂停函数执行