Node.js 回调函数来解决SQL语句与返回值的异步问题

来源:互联网 发布:mysql,书 编辑:程序博客网 时间:2024/05/18 01:38

    作为一个刚刚接触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);});});
    程序可以按照原次序执行了。
   



0 0
原创粉丝点击