等待功能在节点中完成,然后显示接收到的数据

时间:2019-02-15 01:02:20

标签: javascript node.js callback

我正在尝试从Node中的API调用发回结果数据。我有一个带有搜索栏的HTML表单,该表单带有搜索词,并使用该词触发搜索。

现在,数据被发送回,并且在第一次单击时为空,但是当我再次单击时,来自上一次调用的数据将被发送回我的HTML页面,因此我知道回调方面存在一些问题。我可以在res.json()上使用setTimeout,但这似乎有点...少年。

我对Node很陌生,我知道解决方案很简单...但是我似乎不太清楚。

承诺,回调,异步。也许我对他们的去向有些困惑...

var result;
var Questrade = require("questrade");
var qt = new Questrade("env.KEY")
qt.account = "env.ACCOUNT";

qt.on("ready", function(err) {
  if (err) {
    console.log(err);
  }
});

function searchQt() {
  qt.search(searchTerm, function(err, symbols) {
    if (err) {
      console.log(err);
    }

    result = symbols;
  });
}

app.get("/search", function(req, res) {
  searchTerm = req.query.symbol;

  searchQt();

  res.json(result);
});

我希望能及时收到我的数据。

1 个答案:

答案 0 :(得分:1)

最简单,最增量的解决方案是将res.json(result)移至接收到result值的回调中。

function searchQt(res) {  // <-- note added argument
  qt.search(searchTerm, function(err, symbols) {
    if (err) {
      console.log(err);
    }
    result = symbols;
    res.json(result);   // here it is!
  });
}

app.get("/search", function(req, res) {
  searchTerm = req.query.symbol;

  searchQt(res); <-- note added argument

  // res.json(result);  <-- commented out and moved above
});

您还可以使事情与promise或async / await一起工作,但是由于您已经在使用回调,因此这是获取工作代码的最增量方式。

在其中时,应从外部范围中删除result。您不需要或不希望在请求之间保留该值。因此,只需res.json(symbols);并完全摆脱results变量即可。

传递res作为类似上面的参数有点儿代码味道。让我们将对qt.search()的调用直接移到app.get()的回调中,以进行一点清理。这完全消除了searchQt()函数:

app.get("/search", function(req, res) {
  searchTerm = req.query.symbol;

  qt.search(searchTerm, function(err, symbols) {
    if (err) {
      // handle error here somehow. maybe something like this?
      console.log(`An error occurred: ${err}`);
      res.status(500).end('An error occurred');
      return;
    }
    res.json(symbols);
  });
});

这里还有其他一些可能的改进。 (例如,我不确定ready事件是否需要在尝试搜索之前触发。因此,那里可能存在竞争条件。)承诺或异步/等待可能会使此事件更具可读性。 (人们似乎比嵌套的回调更喜欢那些回调。我个人并不介意嵌套,但是我理解了。)但是,这有望使您朝着正确的方向前进。 (希望我没有添加以前没有的任何错误!)