第1页
Node.js异步编程
Asynchronous Programming by @朴灵
13年7月6⽇日星期六
第2页
About me
• @朴灵/⽥田永强 • 就职阿⾥里数据平台产品部开发⼯工程师 • 《深⼊入浅出Node.js》专栏(书)作者
13年7月6⽇日星期六
第3页
Agenda
• Pyramid of Doom • Callbacks • Events • Deferred/Promise • Flow Control
13年7月6⽇日星期六
第4页
Pyramid of Doom
13年7月6⽇日星期六
第5页
别笑,我是回调函数
13年7月6⽇日星期六
第6页
排个序
13年7月6⽇日星期六
第7页
再排个序
13年7月6⽇日星期六
第8页
⾼高阶函数
• 可以将函数作为参数或者返回值 • map, filter, forEach, reduce, every?
13年7月6⽇日星期六
第9页
⾼高阶函数
13年7月6⽇日星期六
第10页
常⻅见场景
13年7月6⽇日星期六
第11页
嵌套过深怎解?
• 视图渲染分别需要如下资源: • 数据 • 模版 • 本地化资源
13年7月6⽇日星期六
第12页
⻚页⾯面渲染
13年7月6⽇日星期六
第13页
问题还是没有解决
• 性能差!!! • 代码丑!!! • ⽼老⼦子再也不写Node.js
13年7月6⽇日星期六
第14页
13年7月6⽇日星期六
第15页
• ⼀一个能搞定回调函数嵌套问题的男⼈人
13年7月6⽇日星期六
第16页
初阶EventProxy
13年7月6⽇日星期六
第17页
EventProxy好处
13年7月6⽇日星期六
第18页
EventProxy好处
• 不再串⾏行执⾏行,并⾏行异步,效率提升
13年7月6⽇日星期六
第19页
EventProxy好处
• 不再串⾏行执⾏行,并⾏行异步,效率提升 • 通过事件传递数据
13年7月6⽇日星期六
第20页
EventProxy好处
• 不再串⾏行执⾏行,并⾏行异步,效率提升 • 通过事件传递数据 • 搞定嵌套函数过深的问题
13年7月6⽇日星期六
第21页
EventProxy好处
• 不再串⾏行执⾏行,并⾏行异步,效率提升 • 通过事件传递数据 • 搞定嵌套函数过深的问题 • 对结果收敛,不执着细节
13年7月6⽇日星期六
第22页
主要⼿手段
• 计数器 • 事件
13年7月6⽇日星期六
第23页
问题
• 事件必须先绑定,后触发
13年7月6⽇日星期六
第24页
Deferred/Promise
• CommonJS之Promise规范 • Promise/A • Promise/B • Promise/D
13年7月6⽇日星期六
第25页
⺫⽬目的
• 异步的⾏行为与逻辑的绑定分离 • 顺便解决代码嵌套的问题
13年7月6⽇日星期六
第26页
典型应⽤用
13年7月6⽇日星期六
第27页
基本原理
• 状态机
13年7月6⽇日星期六
第28页
状态转换
未完 成态
完成态 失败态
13年7月6⽇日星期六
第29页
then
13年7月6⽇日星期六
第30页
Deferred/Promise关系
• Deferred主内,改变内部状态 • resolve • reject • Promise主外,接受外部逻辑 • then
13年7月6⽇日星期六
第31页
完成态
未完 成态
deferred
失败态
then(sucess, error)
promise
13年7月6⽇日星期六
第32页
deferred
promise
then
then
13年7月6⽇日星期六
第33页
⽰示例
13年7月6⽇日星期六
第34页
实现Promise
13年7月6⽇日星期六
第35页
实现Deferred
13年7月6⽇日星期六
第36页
⽰示例
13年7月6⽇日星期六
第37页
解决多异步协作
13年7月6⽇日星期六
第38页
⻚页⾯面渲染
13年7月6⽇日星期六
第39页
Deferred/Promise
• Note:本实现不严谨 • Deferred/Promise⾮非常易⽤用 • 缺点:要为每个异步场景预先封装
13年7月6⽇日星期六
第40页
Events VS Promise
• 事件 • 异步调⽤用过程⽆无需处理 • 需要预置业务逻辑 • Promise • 需要预先封装异步过程 • 调⽤用代码干净
13年7月6⽇日星期六
第41页
更好的流程控制
• 不要前戏、要⾼高潮
13年7月6⽇日星期六
第42页
Async.js
13年7月6⽇日星期六
第43页
Step
13年7月6⽇日星期六
第44页
实现原理
• 玩转⾼高阶函数 • 逻辑注⼊入
13年7月6⽇日星期六
第45页
13年7月6⽇日星期六
第46页
13年7月6⽇日星期六
第47页
别忘了异常处理
13年7月6⽇日星期六
第48页
感觉?
• 不⾼高端 • 不⼤大⽓气 • 不上档次
13年7月6⽇日星期六
第49页
13年7月6⽇日星期六
第50页
⻚页⾯面渲染
13年7月6⽇日星期六
第51页
⻚页⾯面渲染
13年7月6⽇日星期六
第52页
Wind.js
• 基于Task的Promise • 利⽤用编译技巧让⼈人同步写代码
13年7月6⽇日星期六
第53页
ES6 Harmony
• Generators/Yield
13年7月6⽇日星期六
第54页
总结
• 事件 • 队列 • 计数器 • ⾼高阶函数
13年7月6⽇日星期六
第55页
阿⾥里数据平台招聘
• Web⼯工程师(Node) • 前端⼯工程师 • 数据可视化 • 数据相关职位 • 私信:@朴灵 • 邮件:puling.tyq@taobao.com
13年7月6⽇日星期六