【发布时间】:2013-07-28 22:18:10
【问题描述】:
在 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方法。
【问题讨论】:
-
这些函数中的哪一个在调用异步的东西?顺便说一句:我认为应该是
return middlewareFunc.call(this, function()...) -
basilikum,中间件函数本身可能会做一些异步的事情,例如从数据库中选择一些记录,或点击文件系统等。
-
好的,它到底应该做什么?就像现在一样,您似乎想遍历所有中间件函数并在最后调用渲染函数?或者你可能先调用render,得到一堆中间件函数,全部执行,然后再调用render?
-
同意@basilikum。在这段代码中似乎没有什么是异步的。回调!=异步。
-
我已经更新了示例中间件。希望它更清楚
标签: javascript node.js asynchronous callback