【问题标题】:return value from a function with asynchronous commands使用异步命令从函数返回值
【发布时间】:2015-01-08 14:43:02
【问题描述】:

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

我想创建一个函数来返回一行的id,如果该行不存在,创建它然后返回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;
                    });
                });
        }
    });
    });

}

现在的问题是,由于它是异步的,所以函数在返回值之前就结束了。

我该如何解决这个问题?

【问题讨论】:

  • 您添加了一个名为mariasql 的新标签,您介意告诉我它是什么吗? googling 没有出现太多。
  • 在 google 上搜索 node-mariasql

标签: node.js mariasql


【解决方案1】:

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
})

【讨论】:

  • 承诺是另一种模式
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多