JavaScript では、オブジェクトの関数をオーバーライドしたいのですが、元の関数を呼び出してその値を返します。だから私は通常、次のようなことをします:
var render = res.render;
res.render = function() {
doSomethingNew();
return render.apply(this, arguments);
};
ただし、そのオーバーライドに、元の関数を呼び出す前に最初に起動する必要がある非同期コールバックが含まれている場合はどうでしょうか。
var render = res.render;
res.render = function() {
var self = this;
var args = arguments;
var middlewares = getSomeMiddleware();
return callNextMiddleware(middlewares, function() {
return render.apply(self, args);
});
};
function callNextMiddleware(middlewares, callback) {
var middlewareFunc = middlewares.shift();
if (middlewareFunc) {
return middlewareFunc.call(function() {
return callNextMiddleware(middlewares, callback);
});
}
else {
return callback();
}
}
必要に応じて「return」ステートメントを使用していることに注意してください。ただし、「ミドルウェア」変数は関数の配列であり、各ミドルウェア関数は次のようになります。
function myMiddleware(next) {
performLongRunningAsyncDataAccess(function() {
next();
});
}
「return next()」を使用しないため、元の res.render メソッドの戻り値が返されることはありません。すべてのミドルウェア関数で「return next()」を使用するようにすると、これを機能させることができますが、それらは外部ソースからのものであるため、それらを制御することはできません。「next()」を呼び出すことを保証することしかできません。 .
少し背景を説明すると、これは Node.js アプリです。ミドルウェアは基本的に Connect ミドルウェアで、Express.js の res.render メソッドをオーバーライドしようとしています。