[英]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.