mtfbwy 2017-05-20 13:35 采纳率: 25%
浏览 2012

新人自学遇到的nodejs的执行顺序问题

 var findTalk = function(id){
 connection.query('SELECT id,content,date,userimg,username FROM talk'+id, function(err, rows, fields) {
  if (err)
    throw err;
  if (rows) {
    for (var i = 0; i < rows.length; i++) {
      var talk = {
        id: 0,
        content: "",
        date: '',
        userimg: '',
        username: ''
      };
      talk.id = rows[i].id;
      talk.content = rows[i].content;
      talk.date = rows[i].date.toString().substr(0, 21);
      talk.userimg = rows[i].userimg;
      talk.username = rows[i].username;
      talks.push(talk);

    }
console.log('1');
  }

});

};

app.get('/talk/', function(req, res) {

  var id = req.query.id;
  findTalk(id);
for (var i = 0; i < talks.length; i++) {
  json[i] = talks[i];
}
  console.log('2');
  res.send(json);
});

返回到客户端的json数组总是空,执行后也是在控制台先输出2,后输出1,明明findData(id)在前,为什么先输出了2,而不是先输出findData里的1

  • 写回答

2条回答 默认 最新

  • 当作看不见 2017-05-20 14:39
    关注

    由于函数回调,你可以这么理解 js 是单线程,但是异步
    单线程,就是会从头执行到尾,但是由于有异步,回调函数的存在.才能使程序高效.
    这里先查数据库,一个异步函数,查数据库需要时间(数据库查找,),所以执行后,就放一个监听器,也就是回调函数,
    js代码继续执行下面的console.log(2),等监听器,监听到数据库返回了数据时,才会执行,数据库查询回调函数里面的事情,也就是输出1;
    所以上面的事情是这样发生的,
    1.先查数据库 ,-->监听回调,等待数据库响应
    2.继续执行console.log(2);
    3.数据库响应数据了,继续执行.
    注意一下执行队列,回调函数只是把回调放到当前队列的最前面,而不是立即执行.例如前面一个大循环需要几秒钟,那么回调函数就需要等待执行完,才会继续执行.
    js 理解回调,和处理好回调,基本上没有什么特别大的难度

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料