簡體   English   中英

使用nodejs進行異步調用並表達

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM