2013-03-26 2 views
2

Я пытаюсь получить значение из базы данных. Попробуйте это с демонстрационным примером. Но у меня возникла проблема с синхронизацией вызовов, с использованием функции обратного вызова. Я новичок в node.js, поэтому не знаю, правильно ли это.Nodejs MySQL connection query возвращаемое значение для вызова функции

FILE 1: app.js

var data; 

var db = require('./db.js'); 

var query = 'SELECT 1 + 1 AS solution'; 

var r = db.demo(query, function(result) { data = result; }); 

console.log('Data : ' + data); 

FILE 2: db.js

var mysql  = require('./node_modules/mysql'); 

var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'root', 
    password : 'root', 
}); 

module.exports.demo = function(queryString, callback) { 
    try { 
     connection.connect(); 
     console.log('Step 1'); 

     connection.query(queryString, function(err, rows, fields) { 
      console.log('Step 2'); 
      if (err) { 
       console.log("ERROR : " + err); 
      } 
      console.log('The solution is: ', rows[0].solution); 

      callback(rows[0].solution); 

      return rows[0].solution; 
     }); 
     callback(); 

     connection.end(); 
     console.log('Step 3'); 
    } 
    catch(ex) { 
     console.log("EXCEPTION : " + ex); 
    } 
}; 

ВЫВОД:

Именуется этот вопрос также, но оно не решить мою проблема: nodeJS return value from callback

ответ

3

Вопрос заключается в следующем:

var r = db.demo(query, function(result) { data = result; }); 

console.log('Data : ' + data); 

console.log будет работать до того, как функция обратного вызова вызывается, потому что db.demo является асинхронным, а это означает, что это может занять некоторое время, чтобы закончить, но все время следующей строки код, console.log, будет выполнен.

Если вы хотите получить доступ к результатам, вы должны ждать для функции обратного вызова будет называться:

var r = db.demo(query, function(result) { 
    console.log('Data : ' + result); 
}); 

Это как большая часть кода работы с I/O будет функционировать в узле, так что это важно узнайте об этом.

+0

спасибо. Его выполнение так, как должно, но я сомневаюсь, используя вышеупомянутый подход, мы можем выполнять только действия по результату, который мы получили в области функции обратного вызова, правильно ...? – Aks1357

+0

если я хочу выполнить действие над данными после вызова функции wil it work ..? – Aks1357

+0

Нет, это не так, но вот как работает узел. Существуют библиотеки, которые смягчают этот вид рабочего процесса, например [q] (https://github.com/kriskowal/q). – robertklep

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