2013-02-10 4 views
1

Я новичок в Javascript, и я пытался сделать функцию, чтобы вернуть массив itens, который я получил из своей БД. Сначала я попытался это:Область Javascript. Как получить информацию из функции обратного вызова? Node-mysql

function getItens(userId){ 

    var arr = new Array; 
    var result; 
    var connection = mysql.createConnection({ 
     host  : 'localhost', 
     user  : 'XXXXXX', 
     password : 'XXXXXX', 
     database : 'XXXXXX', 
    }); 

    connection.connect(); 
    connection.query('SELECT * from itens where userId = '+ userId function(err, rows, fields){ 
     if (err) throw err; 
     arr = rows.slice() 
    }); 

    return arr; 
    connection.end(); 
} 

Тогда я понял, что проблема существует сфера, и после некоторых исследований я пытался подражать статической переменной, как это:

function getItens(userId){ 

    (function(){ 
     var resultado; 
     Result = function(valor) { resultado = valor; }; 
     Result.prototype.getResultado = function(){return resultado}; 
     Result.prototype.setResultado = function (valor){ resultado = valor; }; 
    })(); 

    var ar = new Result([]); 


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

    connection.connect(); 
    connection.query('SELECT * from itens where userId = '+ userId , function(err, rows, fields){ 
     if (err) throw err; 
     ar.setResultado(rows.slice()); 

    }); 

    return ar.getResultado(); 
    connection.end(); 
} 

Но это не сработало, Что я делаю не так?

+0

возможно дубликат [Variable не получить возвращается из функции AJAX] (http://stackoverflow.com/questions/12475269/variable-doesnt-get-returned-from-ajax-function) –

ответ

2

Вы вызываете функцию обратного вызова к функции query, потому что она не выполняется немедленно.

На линии сразу после вызова connection.query обратный вызов еще не запущен.

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

function fetchItens(userId, callback){ 

    var arr = new Array; 
    var result; 
    var connection = mysql.createConnection({ 
     host  : 'localhost', 
     user  : 'XXXXXX', 
     password : 'XXXXXX', 
     database : 'XXXXXX', 
    }); 

    connection.connect(); 
    connection.query('SELECT * from itens where userId = '+ userId function(err, rows, fields){ 
     if (err) throw err; 
     arr = rows.slice() 
     callback(arr); 
    }); 
    connection.end(); 
} 

fetchItens(someId, function(arr){ 
    // use arr 
}); 
0

Поскольку большая часть I/O в NodeJS является асинхронной, вам нужно изменить функции и код, который вы использовали, с помощью вызова функции. Вы должны думать в «обратном вызове» и понимать, что возврат не может быть использован в этих случаях. При запросе он не выполняется сразу. Он просто регистрирует обратный вызов и когда сервер MySQL отвечает на ваше приложение, только тогда вызывается обратный вызов. Пример:

function getItems(userid, callback){ 
    connection.connect(); 
    connection.query("SELECET .....", function(err,rows,fields){ 
     callback(rows.slice()); 
    } 
} 

var userid = 5; 
getItems(userid, function(items){ 
    for(var i in items){ 
    ..... 
    } 
});