2013-04-19 5 views
1

Я пытаюсь реорганизовать некоторую сложность в функцию, называемую getData, но код, вызывающий эту функцию, похоже, не дает результатов.Функция не возвращает результаты

function getData(sql) { 
    pool.getConnection(function(err, connection) { 
    if (err) return; 
    connection.query(sql, function(err, rows) { 
     if (err) return; 
     if (rows.length > 0) { 
     console.log(rows); // This outputs result from table 
     return rows; 
     } else { 
     return [{"error":"Not found"}]; 
     } 
    }); 
    connection.end(); 
    }); 
} 

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

app.get('/1/employees/past', function(req, res, next) { 
    var rows = getData("select * from users"); 
    res.json(rows); 
}) 

ответ

5

Ваш return возвращается из внутренней функции, которая не влияет на внешнюю функцию.

Вам нужно будет захватить его и вернуть его, и, видя, что он работает с обратными вызовами, вам необходимо передать дополнительный обратный вызов на getData().

Что-то вроде этого ...

function getData(sql, callback) { 
    // ...  
    connection.query(sql, function(err, rows) { 
     // ... 
     callback && callback(rows); // etc 
    }); 
    // ... 
} 

Если вы хотите быть безопаснее, обеспечить обратный вызов реализует [[Call]] с typeof (ссылка на моей блоге).

+0

Спасибо. Это послало меня в правильном направлении :) – robzolkos

0

getData функция ничего не возвращает! Функция getConnectionвнутри Функция getData вызывает функцию, которая вызывает функцию, которая возвращает что-то; сама функция getData ничего не возвращает.

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

Вы или собираетесь синхронный маршрут return или асинхронный маршрут обратного вызова, вы не можете смешивать оба стиля.

0

Функция getData не возвращает ничего - операторы возврата внутри кода предназначены для анонимных функций, которые вы передаете в connection.query и connection.query.

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

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