在Orc Engine开发过程中,需要用到中间件系统(middleware).目的是帮助输入数据按中间件进行流式处理并最终输出处理结果.
实现目的
在预想中,我们通过载入一个中间件函数列表,每个函数包含输入数据及下一步的呼出内容.
[function(input,next){
//do something. & call next(err,output)
}]
最终,通过读取中间件函数最后一次执行的输入数据,就可以完成一个数据在中间件内部的流式处理.
实现方法
由于es6中Promise
本身就可以处理类似的问题,所以我们使用Promise
来连接函数和函数之间的处理.
/**
* Create middleware promise list
* @param {Object} taskInputData Task data
* @param {Array} funcList Function Array list
* @return {Object} Promise object
*/
function middlewareTaskCreate(taskInputData,funcList){
let promiseFunc=new Promise(function(resolve){
resolve(taskInputData);
});
if(funcList.length>0){
//Create promise list
funcList.forEach((func)=>{
promiseFunc=promiseFunc.then(function(outputData){
return new Promise(function(resolve,reject){
func.call(this,outputData,(err,data)=>{
if(err) reject(err);
else resolve(data);
});
});
});
});
}
return promiseFunc;
}
middlewareTaskCreate
本身返回一个promise对象.通过循环函数列表,重置promise对象的进程.当没有时,返回它本身的数据.
更一步优化
由于taskInputData
并不限定输入数据的类型,所以当为object
或array
时,中间件函数总是处理同一个引用,这样形成了对输入数据的污染.(这里埋了一个坑)
在后续的开发时将会通过对输入数据的类型/值检测
以及深复制数据
来解决污染问题.