Javascript setImmediate内部setImmediate替换
我有一个这样的结构,它是一个“操作”定义数组:Javascript setImmediate内部setImmediate替换,javascript,node.js,Javascript,Node.js,我有一个这样的结构,它是一个“操作”定义数组: { http1: { operation:"http", params:{...parameters spesific to operation...}, name:"http1", success: "sendmail2", error: "writefile3" }, sendmail2: { operation:&qu
{
http1: {
operation:"http",
params:{...parameters spesific to operation...},
name:"http1",
success: "sendmail2",
error: "writefile3"
},
sendmail2: {
operation:"sendmail",
params:{...parameters spesific to operation...},
name:"sendmail2",
success: "http4",
error: "writefile3",
},
... and so on
}
几乎所有操作实际上都是在内部执行异步操作的函数(如http调用、发送邮件、读取文件等),并将上面的操作对象和回调(下一步)作为参数,类似于以下内容:
function operation_function(operation_object, next){
doSomeAsyncStuff(operation_object.params.x,operation_object.params.y, function(err,result){
if(err){
next(operation_object.error);
}
else{
next(operation_object.success);
}
});
}
操作也会将错误或结果传递给下一个,或者有成功或错误以外的可能性,但我针对这个问题简化了它们
现在有一个函数运行这些操作(此处简化),操作函数是一个require
d操作文件
function runOperations(operation_list,operation_name,result_callback){
let operation = operation_list[operation_name];
//this is the operation function above
operationFunctions[operation.operation](operation, function (next_operation){
//this is the next function
if(!nextOperation){
result_callback();
}
else setImmediate(runOperations,operation_list,next_operation,result_callback);
});
}
有一个名为start的特殊操作,它只指向另一个操作,我在http服务器请求处理程序中调用runOperations,从请求参数中获取操作列表名称,从数据库中获取列表,并使用start操作调用runOperations,回调是对http请求的响应
我的问题是,我不能递归调用runOperations,也不能直接调用下一个_操作的函数来代替setImmediate,因为操作_列表可能足够长,导致“达到最大调用堆栈大小”
setImmediate解决了这个问题,但我认为除了setImmediate之外,还有更好的方法。process.nextTick通常是不可用的,因为有两个同步函数,并且存在多次同步调用process.nextTick并耗尽事件循环的非零可能性
我的主要问题是,这个东西存在于http服务器请求处理程序中,并且可能同时运行多个不同的操作,setImmediate在运行多个操作(同时处理多个请求)时似乎会对性能产生影响
任何指导都将不胜感激