作为一个刚刚接触Node的菜鸟,面对Node的异步问题着实是头大。最近做一个前端的分页问题,原代码是顺序执行两条sql语句然后返回:
client.query( //第一个sql
'SELECT * FROM products' ,
function selectCb(err, results, fields) {
if (err) {
throw err;
}
if(results)
{
len=0;
for(var i = 0; i < results.length; i++)
{
len = len+1;
}
}
}
);
client.query( //第二个sql
'SELECT * FROM products where id>'+(page-1)*size+' and id<='+page*size,
function selectCb(err, results, fields) {
if (err) {
throw err;
}
if(results)
{
data = [];
for(var i = 0; i < results.length; i++)
{
data[i] = {id:results[i].id, image:results[i].image};
console.log("%d\t%s", results[i].id, results[i].image);
}
}
}
);
response.writeHead(200, {'Content-Type': 'text/plain','Access-Control-Allow-Origin':'*'});
str = " {\"records\": ";
str += JSON.stringify(data); //此处为一个[]数组
str += ",\"len\": ";
str += len;
str += ",\"status\": ";
str += 1;
str += "}";
response.end(str);
但实际上,结果是Node先返回了response,然后执行的sql语句。
后来通过查阅,初步了解了通过回调函数来实现同步,修改程序如下:
client.query( //第一个sql
'SELECT * FROM products' ,
function selectCb(err, results, fields) {
if (err) {
throw err;
}
if(results)
{
len=0;
console.log("client.query1");
for(var i = 0; i < results.length; i++)
{
len = len+1;
}
}
client.query( //第二个sql
'SELECT * FROM products where id>'+(page-1)*size+' and id<='+page*size,
function selectCb(err, results, fields) {
if (err) {
throw err;
}
if(results)
{
data = [];
for(var i = 0; i < results.length; i++)
{
data[i] = {id:results[i].id, image:results[i].image};
console.log("%d\t%s", results[i].id, results[i].image);
}
}
response.writeHead(200, {'Content-Type': 'text/plain','Access-Control-Allow-Origin':'*'});
str = " {\"records\": ";
str += JSON.stringify(data); //此处为一个[]数组
str += ",\"len\": ";
str += len;
str += ",\"status\": ";
str += 1;
str += "}";
response.end(str);
});
});
程序可以按照原次序执行了。