2015-01-08 2 views
0

Я пишу приложение NodeJS v0.10 с MariaSQL.возвращаемое значение из функции с асинхронными командами

Я хочу создать функцию, которая возвращает идентификатор строки, и если строка не существует, чтобы создать ее, а затем вернуть идентификатор.

это то, что я до сих пор:

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

} 

теперь проблема в том, что, так как это асинхронная функция заканчивается до возвращается значение.

как я могу решить эту проблему?

+0

вам «Вы добавили новый тег под названием« mariasql », не могли бы вы сказать мне, что это такое? [googling] (https://www.google.co.in/search?q=MariaSQL&oq=MariaSQL&aqs=chrome..69i57j69i60&sourceid=chrome&es_sm=93&ie=UTF-8&qscrl=1) не получилось. – gideon

+0

Поиск node-mariasql на google – ufk

ответ

1

Стандартный способ в nodejs для работы с асинхронным кодом - предоставить функцию обратного вызова в качестве последнего аргумента для вашего метода и вызвать его всякий раз, когда ваш асинхронный завершается. Стандартная функция обратного вызова подписи (эээ, данные) - вы можете прочитать больше о здесь: 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 
}) 
+0

обещания - альтернативный шаблон –

Смежные вопросы