return 来自具有异步命令的函数的值

return value from a function with asynchronous commands

我正在使用 MariaSQL 编写 NodeJS v0.10 应用程序。

我想创建一个 return 行 ID 的函数,如果该行不存在,则创建它,然后 return ID。

这是我目前拥有的:

TuxDb.prototype.createIfNEDrinkCompany = function(drinkCompany) {
 this.client.query("insert into drink_company(drink_company_name) values(:drink_company) on duplicate key update drink_company_id=drink_company_id",
    {'drink_company' : drinkCompany})
    .on('result',function(res) {
    res.on('end',function(info){
        if (info.insertId > 0) {
                return info.insertId;
        } else {
            this.client.query("select drink_company_id from drink_company where drink_company_name = :drink_company",{'drink_company' : drinkCompany})
                .on('result',function(res){
                    res.on('row',function(row){
                        return row.drink_company_id;
                    });
                });
        }
    });
    });

}

现在的问题是,由于它是异步的,函数在 returned 值之前结束。

我该如何解决这个问题?

nodejs 中处理异步代码的标准方法是提供一个回调函数作为方法的最后一个参数,并在异步完成时调用它。回调函数标准签名是 (err, data) - 您可以在此处阅读更多信息:Understanding callbacks in Javascript and node.js

重写您的代码:

TuxDb.prototype.createIfNEDrinkCompany = function(drinkCompany, callback) { 
 this.client.query("insert into drink_company(drink_company_name) values(:drink_company) on duplicate key update drink_company_id=drink_company_id",
    {'drink_company' : drinkCompany})
    .on('result',function(res) {
    res.on('end',function(info){
        if (info.insertId > 0) {
                callback(null, row.drink_company_id);
        } else {
            this.client.query("select drink_company_id from drink_company where drink_company_name = :drink_company",{'drink_company' : drinkCompany})
                .on('result',function(res){
                    res.on('row',function(row){
                        callback(null, row.drink_company_id);
                    });
                });
        }
    });
    });

}

然后在代码中调用您的方法

db.createIfNEDrinkCompany(drinkCompany, function(err, id){
    // do something with id here
})