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



我正在使用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);
});

一种更高级的方法是查看上次回调后是否有足够的时间,然后发送答案等。

有很多方法。

当然,这里的问题是,即使它防止响应多次发送,也不会阻止回调将来发射,可能会占用系统资源。

流将是一个更好的模式用于此类情况,但是由于您无法更改回调的函数,因此您必须使用以上类似的解决方案。

最新更新