https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
http://www.ruanyifeng.com/blog/2015/04/generator.html
https://blog.oyanglul.us/javascript/functional-javascript.html#sec-2-2
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function
http://es6.ruanyifeng.com/#docs/async
普通函数嵌套,多层异步嵌套,加上错误处理,代码很乱,不好看。
然后迎来了Promise和generator,promise中执行异步逻辑,然后执行reject或者resolve来改变promise的状态,接着promise外通过then或catch注册的回调函数就会执行,相比普通的函数嵌套,这里就相当于把结果处理的函数放到了外面,从而减少了嵌套的层数。回调函数中也可以返回promise,这样外面then返回的promise的状态就会跟随里面的promise,也就是说里面的promise的处理也可以放到最外面去,也可以减少嵌套的层数,看上去就很像同步函数了。
接着generator也可以配合promise来使用,它可以实现一些类似于状态机的效果,generator内部yield多个值,外部通过next来控制内部代码段的执行。用它还可以实现一些无限长的序列。除此之外它还有一些比较灵活的自动执行方面的技巧(co库),涉及到函数式编程、柯里化之类的概念。
最后,终极的解决方案就是ES7里面的async函数。是generator的升级版,generator需要调用next,代码才会往下执行,但async函数自带执行器,内部的代码会自动往下执行,很方便。自动执行的原理:http://es6.ruanyifeng.com/#docs/async#async-函数的实现原理
大概就是,把await全部变成yield,然后获取generator,执行一个函数如step,里面调用一次next,获取到第一个值,通过Promise.resolve转为一个promise,然后再上面用then注册回调方法,回调方法里继续调用step。递归调用
事件绑定和异步的对比
$btn.on('click', function (e) { console.log('你点击了按钮') }) fs.readFile('data1.json', function (err, data) { // 获取数据 })
两者都是运行在事件循环中,但是回调函数的调用源不一样,异步的调用源是系统,而事件绑定须要通过用户去触发
自己实现一个Promise:https://github.com/geekinpink/GPromise