使用偏函数解决回调地狱,解耦代码

508 阅读1分钟

入职的新公司,刚开始维护老项目,里面有很多jQuery代码,现在需要增加一个新需求,需要执行三个并行的异步操作,加载通用模板,加载数据,layui加载插件模块,正好以前阅读深入浅出nodejs学习了偏函数,现在正好使用和熟悉一下。

  • 比较low的做法
// 这是一段伪代码
layui.use(['laytpl'], function () {
	// 引入layui laytpl模块
	laytpl = layui.laytpl
    loadData('url', function (data) {
		loadHtml('templateAddress', renderHtml(tpl,data))
	})	
})

  • 使用偏函数优化
function render (collectDone) {
	let cache = {
    	laytpl: null, 
        data: null, 
        html: ''
    }
    function cacheFill () {
    	for (let key in cache) {
        	if (!cache[key]) {
            	return false
            }
        }
        return true
    }
    return function (key, data) {
    	cache[key] = data
        if (cacheFill()) {
        	collectDone(cache)
        }
    }
}
let renderCollect = render(renderFn)
layui.use(['laytpl'], () => renderCollect('laytpl', layui.laytpl))
loadData('url', (data) => renderCollect('data', data))
loadHtml('htmlPath', html => renderCollect('html', html))
现在可以结合例子来说下什么是偏函数了,偏函数本质是创建一个可以调用另外一个部分(render中)参数或者变量已经预设的函数(renderCollect),其实这种函数包装函数的做法在js中应用的很多,待有时间再更新
题外话,多个异步并行请求对应一个操作,并且开发支持es6 环境,可以用Promise.all([PromiseList])哦,不过PromiseList里面的成员要是Promise实例