我正在使用Node的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
。该结果确实包含了以前回调中发布的所有值。
那么如何"等待"最后回调或以另一种方式实现这一目标?
我将创建自定义中间件来完成响应之前需要做的事情,然后依靠该自定义中间件来实际发送响应。
ex:
var myCustomMiddleware = function (req, res, next) {
//do what you need to do
//send res.
}
//setup your app
app.use(routes)
app.use(myCustomMiddleware)
如果您不知道要调用回调多少次,则必须猜测 - 要么使用您认为足够的数字,要么花一些时间等待它。
但是,除非您知道调用回调的频率或类似的频率,否则您将无法确定回调的最后一次被调用。
带有许多数据元素的示例:
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);
});
一种更高级的方法是查看上次回调后是否有足够的时间,然后发送答案等。
有很多方法。当然,这里的问题是,即使它防止响应多次发送,也不会阻止回调将来发射,可能会占用系统资源。
流将是一个更好的模式用于此类情况,但是由于您无法更改回调的函数,因此您必须使用以上类似的解决方案。