【问题标题】:How to wait for function to finish in express route如何在快速路线中等待功能完成
【发布时间】:2018-01-25 13:07:13
【问题描述】:

我有这条路线:

   app.get("/api/current_user", (req, res) => {

    //This function takes 3~ seconds to finish
    someObj.logOn(data => {
      someObj.setData(data);
    });

    //This will return before function finishes
    return res.send(someObj.data);
  });

这里是 .logOn() 函数(简化):

logOn(_callback) {
  //has some data
  var info = {};

  //returns data in callback
  _callback(info);
}

问题:有什么方法可以等待函数完成后再返回?这个函数不处理promise,所以我不能使用async/await。我找不到任何好的答案,任何需要等待的东西都必须处理 promises 或 setTimeout。这两个都行不通,对吧?

注意:如果我将 return 语句放在回调中 someObj.setData(data); 的正下方,我会收到如下错误:

发送后无法设置标头

这个错误不是在最初的路由加载时发生的,而是在我再刷新一次之后发生的。

【问题讨论】:

  • 可以立即返回,但在异步回调中发送数据。

标签: javascript node.js express


【解决方案1】:

使用回调。将 res.send 更改为 res.end 以便不设置任何标题。似乎在我们看不到的函数中的响应中写入了一些内容。

 app.get("/api/current_user", (req, res) => {

    //This function takes 3~ seconds to finish
    someObj.logOn(data => {
      someObj.setData(data);
      res.end(JSON.stringify(data));
    });
  });

【讨论】:

  • 是的,这就是我的建议。
  • 如果我将 return 语句放在回调中,我会得到一个“无法设置标题错误”
  • 应该加一秒
  • 返回声明消失了 - 不需要。不知道为什么你会得到一个 can't set headers,除非你试图在这之后的某个地方设置 headers。
  • 一旦我将 return 语句放在回调之外,路由就不会出错。唯一的问题是因为它是异步的,所以返回在数据之前。当它在回调中时,我在刷新时收到错误
猜你喜欢
  • 2020-08-14
  • 2021-10-29
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多