[英]Making async calls with nodejs and express
我有2个功能,第一个:
router.post('/getStances', function(req, res, next) {
var text = '{"success":"0"}';
text = queries.getStances(req.body.issues[0], req.body.issues[1], req.body.issues[2], req.body.issues[3]);
var obj = JSON.parse(result);
res.send(obj);
});
第二:
getStances: function (a, b, c, d) {
var sendback = '{"stances":[';
sendback += '{"1":[';
var querytext = "SELECT * FROM allIssues WHERE topicname = '"+ a +"'";
query = client.query(querytext,function (callback) {
query.on('row', (row) => {
sendback += "{" + '"'+row['topicstance']+'"' + " : " + '"'+ row['topicdescription'] + '"'+ "} , ";
console.log(sendback);
});
});
querytext = "SELECT * FROM allIssues WHERE topicname = '"+ b +"'";
query = client.query(querytext);
query.on('row', (row) => {
sendback += "{" + '"'+ row['topicstance'] + '"'+ " : " + '"'+ row['topicdescription'] + '"'+ "} , ";
});
query.on('end', () => {
sendback += "]}";
sendback += "]}";
client.end();
return sendback;
});
}
第一个函数由客户端应用程序调用,然后调用getStances
进行数据库调用,并应返回一个包含所有数据库信息的JSON字符串,但是当调用text = getStances()
时, text = getStances()
text
设置为undefined
,然后路由器功能的其余部分将运行,然后尝试将text
解析为JSON,但由于undefined
,因此无法正常工作。 如何使路由器功能异步,以便它将在继续其余代码之前等待text = getStances()
完成? 我已经尝试过回调和Promise,但是我得到的结果大致相同,我不确定它们的工作原理,所以也许我使用不正确。 有人可以举例说明如何解决此问题吗?
getStances()
需要一种指示完成的方法-回调或getStances()
。
您的函数签名看起来像:
getStances: function (a, b, c, d, callback) {
someAsynFunction(arg, function(err, result){
if (err) return callback(err) // errors go first by convention
callback(null, results) // callback(error, result)
}
}
然后,可以通过将函数传递给getStances()
进行回调来使用它:
let i = req.body.issues // for brevity
text = queries.getStances(i[0], i[1], i[2], i[3], function(err, result){
if (err) return console.log("error: ", err)
var obj = JSON.parse(result);
res.send(obj);
);
这是基本的节点模式。
目前尚不清楚您使用的是哪种数据库客户端,但我怀疑您的代码中还有另一个问题。
看来您正在getStances()
中进行两个异步调用,并且您指望第一个完成于第二个之前。 这很可能会中断,因此,如果要确保它们顺序发生,则需要找出客户端如何通知它已完成(是否有query.on('finished')
或类似的消息?)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.