Orc开发日志01-使用Promise实现中间件

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并不限定输入数据的类型,所以当为objectarray时,中间件函数总是处理同一个引用,这样形成了对输入数据的污染.(这里埋了一个坑)

在后续的开发时将会通过对输入数据的类型/值检测以及深复制数据来解决污染问题.