我正在编写一个中间件,该中间件将执行一系列动作。序列完成后,我希望中间件致电Next()。从此开始,中间件是多余的。我已经编写了以下代码:(这里的操作顺序是由呼叫settimeout嘲笑的):
function myMiddleware(req, res, next){
console.info("inside myMiddleware");
if (actionDone) {
console.info("middleware redundant. ActionDone, calling next");
next();
}
setTimeout(doneWaiting, 30000);
function doneWaiting(){
actionDone = true;
next();
}
}
此代码将无法使用,因为如果在完成操作之前有多个请求到达,则Settimeout将一次又一次调用。我希望仅一次称为settimeout,只有在完成的所有请求时,我才想在迄今为止的所有请求下调用Next()。
实现这一目标的最佳方法是什么?
谢谢li
如果我正确理解,您要执行任务并处理所有请求后完成了所有请求吗?直到那碰巧他们等待?
因此,这是不可扩展的方式:
var EventManager = new require("events").EventEmitter( );
var actionDone = "start";
function myMiddleware(req, res, next){
console.info("inside myMiddleware");
var handler = function( ) {
console.info("middleware redundant. ActionDone, calling next");
next();
};
if (actionDone === "finished" ) {
handler( );
return;
}
EventManager.once( "finished", handler );
if (actionDone !== "working") {
actionDone = "working";
function doneWaiting(){
actionDone = "finished";
EventManager.trigger( "finished" );
}
setTimeout(doneWaiting, 30000);
}
}
显然,它不能扩展,因为您不能在机器之间共享EventManager
对象。为了在计算机之间执行此操作,您可能必须向其他服务器向其他服务器发出请求并类似地处理请求。
警告:您想做的事情看起来像是一个非常非常糟糕的主意。毕竟所有请求不应彼此依赖。这很容易导致服务器崩溃。
将 actionDone
变量设置为 req
,以下方式
function myMiddleware(req, res, next){
console.info("inside myMiddleware");
if (req.actionDone) {
console.info("middleware redundant. ActionDone, calling next");
next();
}
setTimeout(doneWaiting, 30000);
function doneWaiting(){
req.actionDone = true;
next();
}
}