我使用node's express通过REST api公开计算库。
app.get('/', function(req, res) {
performComputation(data,function(result){
res.send(result);
};
}
我无法更改正在使用的lib的接口或内部。问题是,库多次调用结果回调。对于每个调用,新的计算结果将添加到result
。第一次调用回调时,它可能包含[1]
,第二个[1,91]
,第三个[1,91,31]
等等。
我事先并不知道将调用多少次回调。需要通过req.send()
发送的内容只是在上次执行的回调中提交的result
。此结果已包含在先前回调中发布的所有值。
那么如何“等待”最后一次回调或以另一种方式实现这一目标?
答案 0 :(得分:0)
我会在发送响应之前创建自定义中间件以执行您需要做的事情,然后只依靠该自定义中间件来实际发送响应。
例如:
var myCustomMiddleware = function (req, res, next) {
//do what you need to do
//send res.
}
//setup your app
app.use(routes)
app.use(myCustomMiddleware)
答案 1 :(得分:0)
如果您不知道回叫将被调用多少次,那么您必须猜测 - 要么使用您认为足够的数字,要么花些时间等待它。
但是除非你知道回调被调用的次数或类似情况,否则你将无法确定何时最后一次回调被调用。
包含许多数据元素的示例:
app.get('/', function(req, res) {
performComputation(data,function(result){
if (result.length === 10) {
res.send(result);
}
});
});
等待特定延迟的示例:
app.get('/', function(req, res) {
let data = [];
performComputation(data,function(result){
let data = result;
});
setTimeout(() => {
res.send(data);
}, 1000);
});
更高级的方法是查看在上次调用回调之后是否有足够的时间,然后才发送答案等。有很多方法可以做到。
当然这里的问题是,即使它阻止多次发送响应,它也不会阻止将来触发回调,可能会占用系统资源。
对于像这样的情况,Streams会是一个更好的模式,但是由于你无法改变callas回调函数,所以你必须使用上面的解决方法之一。