最近看阮一峰老师的博客,讲的是JavaScript ES6异步编程,做点笔记:
参考自阮一峰博客-Thunk函数的含义和用法
JS的Thunk函数
Thunk函数
是用来实现“传名调用”,而JavaScript 是“传值调用”,在 JavaScript 中,Thunk 函数
的概念是将多参数函数替换成单参数的版本,且只接受回调函数
作为参数。
一个Thunk函数转换器
const myThunk = function(fn){
return function (){
const args = Array.prototype.slice.call(arguments);
return function (callback){
args.push(callback);
return fn.apply(this, args);
}
};
};
代码实现了将入参fn
函数的多个参数转换成单参数,并且接收回调函数
。通过它可以实现Generator函数
的自动流程管理。
Generator函数自动流程管理示例
1.使用Thunk函数转化器myThunk
将你的异步操作函数Thunk化;
function myAsyncFunc(params) {
//...你的某个异步操作
}
const doAsyncAfterThunk = myThunk(myAsyncFunc)
2.Generator函数封装多个Thunk化后的异步操作:
var myGeneraotr = function* () {
const result1 = yield doAsyncAfterThunk (params1)
const result2 = yield doAsyncAfterThunk (params2)
// ...
}
3. 实现一个Generator函数的执行器
上一篇:Generator-Thunk-Promise之一有写过类似的方法,此处方法学自阮一峰老师。
此处划重点:递归
function runGenerator(fn) {
const gen = fn(); // 返回Generator函数的内部指针,通过next方法移动指针到下一步
function next(err, data) {
const result = gen.next(data); // 不了解返回值的请看【Generator-Thunk-Promise之一】
if (result.done) return; // Generator函数执行完直接返回
result.value(next); // 否则**递归**调用next()方法,result.value必须是一个Thunk函数
}
next();
}
4.最后只需要调用执行执行器
runGenerator(myGeneraotr)
总结
通过Thunk函数转换器
将普通函数转换成单参数的版本,且只接受回调函数
作为参数,再在Generator函数
中多次优雅的调用它,最后再运行Generator函数执行器
,就可以自动完成多个异步操作,更好地实现自动控制Generator函数的流程。
附:
生产环境的Thunk转换器,阮一峰老师建议使用 Thunkify 模块