使用nodejs进行异步调用并表达

时间:2017-09-23 16:19:32

标签: javascript json node.js express asynchronous

我有两个功能,第一个:

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设置为undefined并且其余路由器函数运行,然后它尝试将text解析为JSON,但由于其undefined,它不起作用。如何使路由器功能异步,以便在继续使用其余代码之前等待text = getStances()完成?我已经尝试过回调和承诺,但我得到的结果大致相同,我不确定它们是如何工作的,所以也许我错误地使用了它们。有人可以提供我如何解决这个问题的例子吗?

1 个答案:

答案 0 :(得分:1)

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')或类似吗?),如果您想确保它们按顺序发生。