1、异步编程 ->离不开回调机制 -> 我们希望更好的管理“异步代码”,保证其有好的扩展性、维护性
无论在浏览器环境还是node环境,我们都会使用JavaScript完成各种异步操作,如浏览器环境中的定时器、事件、ajax等,node环境中的文件读取、事件等; -> JS、nodeJS都是单线程,说明一定有其它xx另开启新线程辅助它们执行;
异步编程遇到的问题:回调地狱(其是一种现象,虽可实现功能,但扩展性/维护性较差,不符合“开闭设计原则”)、try{}catch{}只能捕获同步代码出现的异常、并发的异步操作不好解决;
- - - >>> Promise之前的解决方案:(1).jQuery中的Deffered();Callbacks(); (2).引入第三方库,例如Loadsh提供的after();高阶函数辅助回调操作(其就是更高效的操作回调函数);[Loadsh: js工具库,提供各种函数提升开发效率,如柯里化、防抖、节流等];- ->补充:jQuery库主要用于浏览器端,其挂载到window上,而且实例方法操作dom,静态方法没问题,但node环境中没有window, 使用的global,而且也不直接操作dom,因此jQuery解决方案在node中失效;Loadsh库可以在node环境中运行,但需引入第三方库;->前两者主要解决回调地狱问题,try{}catch{}捕获异步代码异常需要“其它笨方法”解决;并发的异步操作可使用 after();或者“发布订阅模式”解决;
- - - >>> ES6 Promise();更高效解决上述所有异步问题,但依旧有很强的回调痕迹,ES6 Generator + Co库,以及ES7的async await可争取让异步代码看起来与同步代码相同,解决方案更加优雅~
(1).常见异步问题及"老旧"解决方案:
nodejs下载Loadsh库:npm i --save lodash; 网址:https://www.lodashjs.com/





2、Promise(); -> ES6新内容,Babel无法对其进行”语法降级“,因此兼容性不好;其管理异步代码的思想借鉴了jQuery以及第三方库;
- - ->>>new Promise(); promise.then();解决回调地狱;promise.catch().finally{};//解决try{}catch{}捕获异步代码错误;Promsie.all(); Promise.race();解决同步并发的异步问题;



3、ES6 Promise可解决回调地狱、try{}catch{}、同步并发的异步问题,但解决回调地狱问题中依旧有很明显的回调痕迹 -> ES6中generator生成器+promise对象+CO库、ES7中的async/await 它们可以让异步代码看起来与同步代码一样,更加优雅;
网友评论