繁体   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