ES6之前,异步编程的方法大概四种。
回调函数
事件监听
发布 / 订阅
Promise对象
基本概念
异步
一个任务分成几段之后,可以先执行第一段,然后转而执行其他任务,等准备好之后再执行第二段。
同步
一个任务分成几段之后,段与段之间不能插入其他任务,必须连续执行,这段时间其他任务只能干等着。
回调函数
任务分成几段之后,第一段中的function定义了第二段函数的参数,这时第二个参数就是回调函数。
Promise
new Promise().then().then()...
Generator函数
协程
多个线程互相协作,完成异步任务。
1 | function *asnycJob() { |
奥妙就在于yield命令的使用。
异步任务的封装
看一个案例。
1 | var fetch = require('node-fetch'); |
例子里用Generator函数实现了异步执行,但是连续调用g.next()
显得流程管理上不是那么方便。
Thunk函数
参数的求值策略
传值调用还是传名调用。传值调用明显更通俗易懂,而且简单实用。而传名调用可能会有性能上的优化。
1 | function f(a, b){ |
Thunk函数的含义
传名调用实现就是将参数放到一个临时函数中,再将这个临时函数传入函数体。这个临时函数就是Thunk函数。
1 | function f(m){ |
Thunk in Javascript
Javascript是执行的传值调用。Thunk将多参数函数替换成单参数版本,只接受回调函数作为参数。
1 | // 正常版本的readFile(多参数版本) |
一个简单的Thunk函数转换器。
1 | var Thunk = function(fn){ |
Generator函数流程管理
正常情况来说,Generator函数封装的异步操作可以如下。
1 | var fs = require('fs'); |