在节点 js 函数中使用回调来保留数据库中的值
Use callbacks in node js function to retain the values from database
var mysql = require("mysql");
var thenJade = require('then-jade');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejs'
});
exports.players_list = function(req, res) {
var data = {title: "", res: {}};
if (authenticate(req, res)) {
results_aaa(function(result) {
console.log(result);
res.render('players/players', {title: 'Players List', res: result});
});
} else {
req.session.error = 'Please login to continue.';
res.redirect('/login');
}
};
function results_aaa(callback) {
teams(function(res) {
callback(res)
});
}
function teams(callback) {
var response = [];
var query = connection.query("select * from team", function(err, result, fields) {
var response = [];
for (var index in result)
{
players(result[index].id, function(results) {
response.push(results);
});
}
console.log(response);
callback(response);
});
}
function players(id, callback) {
query("SELECT * FROM players where team = " + id, function(results) {
callback(results);
});
}
function query(sql, callback) {
connection.query(sql, function(error, results, fields) {
callback(results);
});
}
这里我需要根据他们各自的eams来获取球员。但是在 for 循环中,我只得到第一次迭代值。因为对于异步行为,第二次和第三次迭代值是在数据发送到视图之后出现的。请帮忙
[ { id: 2, player_name: 'Virat Kohli', team: '1' },
{ id: 4, player_name: 'A B DeVilliers', team: '1' },
{ id: 6, player_name: 'Chris Gayle', team: '1' }
GET /players 200 177ms - 556
[ { id: 7, player_name: 'Ajinkya Rahane', team: '2' },
{ id: 8, player_name: 'Shane Watson', team: '2' },
{ id: 9, player_name: 'Stuart Binny', team: '2' },
{ id: 10, player_name: 'Karun Nair', team: '2' },
{ id: 11, player_name: 'Sanju Samson', team: '2' } ]
[ { id: 1, player_name: 'Virender Sehwag', team: '3' },
{ id: 3, player_name: 'David Miller', team: '3' },
{ id: 5, player_name: 'Shaun Marsh', team: '3' } ]
GET /css/bootstrap.min.css 304 5ms
GET /css/bootstrap.css 304 4ms
GET /css/style.css 304 4ms
如您所见,在第一次迭代后,视图已呈现。如何使用回调等到 forloop 完成执行,以便我将获得所有结果集。
请帮忙
提前致谢
试试这个
var async = require('async');
var mysql = require("mysql");
var thenJade = require('then-jade');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejs'
});
exports.players_list = function(req, res) {
var data = {
title: "",
res: {}
};
if (authenticate(req, res)) {
results_aaa(function(result) {
console.log(result);
res.render('players/players', {
title: 'Players List',
res: result
});
});
} else {
req.session.error = 'Please login to continue.';
res.redirect('/login');
}
};
function results_aaa(callback) {
teams(function(err,res) {
callback(res);
});
}
function teams(callback) {
var response = [];
var query = connection.query("select * from team", function(err, result, fields) {
var tasks = [];
result.forEach(function(team) {
tasks.push(function(callback1) {
players(item.id, callback1);
});
});
async.parallel(tasks, function(error, response) {
callback(null, response);
});
});
}
function players(id, callback) {
query("SELECT * FROM players where team = " + id, function(error,results) {
callback(error,results);
});
}
function query(sql, callback) {
connection.query(sql, function(error, results, fields) {
callback(error,results);
});
}
我明白你从哪里来的回电。该问题发生在 'team' 函数内部。当你的 'for' 循环仍然是 运行 时你的回调被调用。您需要找到一种方法在所有 'player' 查询完成后执行回调。
function teams(callback) {
var response = [];
var query = connection.query("select * from team", function(err, result, fields) {
var response = [];
for (var index in result)
{
players(result[index].id, function(results) {
response.push(results);
});
}
console.log(response);
// The loop will continue the run... (because the queries take longer)
// the callback is executed BEFORE the loop is finished running
callback(response);
});
}
解决方案一:
查看 promises。查询的结构方式阻止您使用回调来产生预期结果。
方案二:
如果您希望按各自的球队抓取所有球员,您只需要对球员 table 进行一次查询即可获得所需的输出。请查看下面的 query/example(Select 使用 ORDER BY 查询)。
var mysql = require("mysql");
var thenJade = require('then-jade');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejs'
});
var getPlayersByTeam = function(callback) {
// New query
var playerQuery = "SELECT * FROM players ORDER BY team ASC";
connection.query(playerQuery, function(err, result, fields) {
callback(results);
});
};
var players_list = function(req,res){
var data = {
title: "",
res: {}
};
if (authenticate(req, res)) {
getPlayersByTeam(function(result){
res.render('players/players', {title: 'Players List', res: result});
});
} else {
req.session.error = 'Please login to continue.';
res.redirect('/login');
}
};
exports.players_list = players_list;
var mysql = require("mysql");
var thenJade = require('then-jade');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejs'
});
exports.players_list = function(req, res) {
var data = {title: "", res: {}};
if (authenticate(req, res)) {
results_aaa(function(result) {
console.log(result);
res.render('players/players', {title: 'Players List', res: result});
});
} else {
req.session.error = 'Please login to continue.';
res.redirect('/login');
}
};
function results_aaa(callback) {
teams(function(res) {
callback(res)
});
}
function teams(callback) {
var response = [];
var query = connection.query("select * from team", function(err, result, fields) {
var response = [];
for (var index in result)
{
players(result[index].id, function(results) {
response.push(results);
});
}
console.log(response);
callback(response);
});
}
function players(id, callback) {
query("SELECT * FROM players where team = " + id, function(results) {
callback(results);
});
}
function query(sql, callback) {
connection.query(sql, function(error, results, fields) {
callback(results);
});
}
这里我需要根据他们各自的eams来获取球员。但是在 for 循环中,我只得到第一次迭代值。因为对于异步行为,第二次和第三次迭代值是在数据发送到视图之后出现的。请帮忙
[ { id: 2, player_name: 'Virat Kohli', team: '1' },
{ id: 4, player_name: 'A B DeVilliers', team: '1' },
{ id: 6, player_name: 'Chris Gayle', team: '1' }
GET /players 200 177ms - 556
[ { id: 7, player_name: 'Ajinkya Rahane', team: '2' },
{ id: 8, player_name: 'Shane Watson', team: '2' },
{ id: 9, player_name: 'Stuart Binny', team: '2' },
{ id: 10, player_name: 'Karun Nair', team: '2' },
{ id: 11, player_name: 'Sanju Samson', team: '2' } ]
[ { id: 1, player_name: 'Virender Sehwag', team: '3' },
{ id: 3, player_name: 'David Miller', team: '3' },
{ id: 5, player_name: 'Shaun Marsh', team: '3' } ]
GET /css/bootstrap.min.css 304 5ms
GET /css/bootstrap.css 304 4ms
GET /css/style.css 304 4ms
如您所见,在第一次迭代后,视图已呈现。如何使用回调等到 forloop 完成执行,以便我将获得所有结果集。
请帮忙
提前致谢
试试这个
var async = require('async');
var mysql = require("mysql");
var thenJade = require('then-jade');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejs'
});
exports.players_list = function(req, res) {
var data = {
title: "",
res: {}
};
if (authenticate(req, res)) {
results_aaa(function(result) {
console.log(result);
res.render('players/players', {
title: 'Players List',
res: result
});
});
} else {
req.session.error = 'Please login to continue.';
res.redirect('/login');
}
};
function results_aaa(callback) {
teams(function(err,res) {
callback(res);
});
}
function teams(callback) {
var response = [];
var query = connection.query("select * from team", function(err, result, fields) {
var tasks = [];
result.forEach(function(team) {
tasks.push(function(callback1) {
players(item.id, callback1);
});
});
async.parallel(tasks, function(error, response) {
callback(null, response);
});
});
}
function players(id, callback) {
query("SELECT * FROM players where team = " + id, function(error,results) {
callback(error,results);
});
}
function query(sql, callback) {
connection.query(sql, function(error, results, fields) {
callback(error,results);
});
}
我明白你从哪里来的回电。该问题发生在 'team' 函数内部。当你的 'for' 循环仍然是 运行 时你的回调被调用。您需要找到一种方法在所有 'player' 查询完成后执行回调。
function teams(callback) {
var response = [];
var query = connection.query("select * from team", function(err, result, fields) {
var response = [];
for (var index in result)
{
players(result[index].id, function(results) {
response.push(results);
});
}
console.log(response);
// The loop will continue the run... (because the queries take longer)
// the callback is executed BEFORE the loop is finished running
callback(response);
});
}
解决方案一: 查看 promises。查询的结构方式阻止您使用回调来产生预期结果。
方案二:
如果您希望按各自的球队抓取所有球员,您只需要对球员 table 进行一次查询即可获得所需的输出。请查看下面的 query/example(Select 使用 ORDER BY 查询)。
var mysql = require("mysql");
var thenJade = require('then-jade');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejs'
});
var getPlayersByTeam = function(callback) {
// New query
var playerQuery = "SELECT * FROM players ORDER BY team ASC";
connection.query(playerQuery, function(err, result, fields) {
callback(results);
});
};
var players_list = function(req,res){
var data = {
title: "",
res: {}
};
if (authenticate(req, res)) {
getPlayersByTeam(function(result){
res.render('players/players', {title: 'Players List', res: result});
});
} else {
req.session.error = 'Please login to continue.';
res.redirect('/login');
}
};
exports.players_list = players_list;