如何在一系列回调中等待最后一次回调?

时间:2017-03-15 11:16:34

标签: javascript node.js

我使用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。此结果已包含在先前回调中发布的所有值。

那么如何“等待”最后一次回调或以另一种方式实现这一目标?

2 个答案:

答案 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回调函数,所以你必须使用上面的解决方法之一。