2013-07-16 3 views
0

Я пишу приложение в NodeJS, используя скрипт кофе, и мне нужно сохранить результаты SQL-запроса, сделанного классом, в переменную, которую может вернуть этот класс.Как вернуть результаты .query в класс

У меня есть что-то вроде

class dataBase 
    mySQL = require('mysql'); 
    connection = null; 
    queryResults = null; 

    constructor:(host,user,password,database)-> 
    connection = mySQL.createConnection({ 
     host : "#{host}", 
     user : "#{user}", 
     password : "#{password}", 
     database : "#{database}", 
    }); 

    connection.connect; 

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

query:(input) -> 
    connection.query("#{input}",(err,result)-> 
    queryResults = result; 
); 

    return queryResults; 

Проблема в том, что функция connection.query всегда работает асинхронно, поэтому return queryResults всегда возвращает null.

Есть в любом случае я могу исправить это так, что запрос() возвращает значение результата, если я что-то за пределами класса, как:

myDatabase = new dataBase("fee","fi","foo","fum"); 
users = myDatabase.query("SELECT * FROM users"); 

ответ

0

В «асинхронной» модели программирования (AP) , один обеспечивает обратный вызов, в котором используется результат запроса. Что-то вроде:

myDatabase = new dataBase("fee","fi","foo","fum"); 
myDatabase.query("SELECT * FROM users",function(err,result){ 
    // check for error and do something with result 
}); 

Вся идея AP заключается в том, а не ждать, вещи могут происходить и происходят за пределами обычного потока программы - например, данные становятся доступными - и таким образом, вы должны использовать независимо от результата, который они производят, когда он становится доступным.

Вот почему обратные вызовы AP не возвращают значения. Нет контекста, в который они могут вернуться.

Подумайте, как отправить заверенное письмо через почтовое отделение. Вы передаете свое письмо почтовому лицу и вместо того, чтобы ждать, пока письмо будет доставлено, а квитанция будет доступна, вы делаете другие вещи, оставляя инструкцию, что, как только квитанция будет вручена, она должна быть доставлена ​​в ваш дом или вы должны быть вызваны, чтобы забрать его.

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