我正在尝试从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);
});
我希望能及时收到我的数据。
答案 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
事件是否需要在尝试搜索之前触发。因此,那里可能存在竞争条件。)承诺或异步/等待可能会使此事件更具可读性。 (人们似乎比嵌套的回调更喜欢那些回调。我个人并不介意嵌套,但是我理解了。)但是,这有望使您朝着正确的方向前进。 (希望我没有添加以前没有的任何错误!)