node如何得到正确的返回值

node如何得到正确的返回值

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

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);
});

query是异步执行的,这个和ajax异步查询一个意思,要用回调的形式来获取查询返回,要不talks永远得不到正确的查询返回值

 
    var findTalk = function (id,callback) {///////////////
        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');
 
                callback()///////////
            }
 
        });
 
    };
 
    app.get('/talk/', function (req, res) {
 
        var id = req.query.id;
        findTalk(id, function () {//////////////
            for (var i = 0; i < talks.length; i++) {
                json[i] = talks[i];
            }
            console.log('2');
            res.send(json);
        });
    });

建议使用 async / await 处理这种异步问题更优雅一点。


const findTalk = function (id) {
  return new Promise((resolve, reject) => {
    connection.query(`SELECT id,content,date,userimg,username FROM talk${id}`, (err, rows, fields) => {
      if (err) reject(err);
      if (rows) {
        for (let i = 0; i < rows.length; i++) {
          const 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");
        resolve();
      }
    });
  });
};

app.get("/talk/", async (req, res) => {
  const id = req.query.id;
  try {
    await findTalk(id);
  } catch (err) {
    console.log(err);
  }
  for (let i = 0; i < talks.length; i++) {
    json[i] = talks[i];
  }
  console.log("2");
  res.send(json);
});

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632