Я не могу дождаться результата запроса SQL

Вот как выглядит мой код

socket.on('new', async function(information) {
  console.log("check no offer en cours");
  var checkOffer = "SELECT COUNT(*) as total FROM app__offer WHERE status_id = 1 AND profile_id = " + user.idUser;
  doInsert = false;
  con.query(checkOffer, function(err, result) {
    if (err) throw err;
    console.log(result[0].total);
    if (result[0].total == 0) {
      console.log("can insert");
      doInsert = true;
    }
  }).then(function() {
    console.log(doInsert);
    if (doInsert) {
      console.log("create offer");
      var sql = "INSERT INTO app__offer (createdAt,updatedAt, startAt, programmed, startLatitude, startLongitude, commune_id, point_id, status_id,device,profile_id) " +
        "VALUES ('" + todayDateTime + "','" + todayDateTime + "','" + todayDateTime + "'," + false + "," + user.latitude + "," + user.longitude + "," + user.idCommuneDestination + "," + user.idPoint + "," + 1 + "," + 'device' + "," + user.idUser + ")";
      console.log(sql);
      con.query(sql, function(err, result) {
        if (err) throw err;
        socket.emit('new', result);
      });
    } else {
      console.log("Cet user a déjà une offre en cours");
    }
  });

Проблема в том, что журнал doInsert выполняется перед журналом canInsert.

0
Minirock 28 Май 2019 в 18:54

2 ответа

Лучший ответ

Я думаю, что con.query() принимает обратный вызов и также «затем» возвращает возвращение Обещания.

В большинстве случаев, если предоставляется обратный вызов, это будет обработчик результата, и он не будет передан в Обещание.

Так

con.query(query, () => {
    // this code is executed when the query ends
}).then(() => {
    // this code is executed when the promise attached to .then() is resolved
    // in this case con.query() is instant resolved cause a callback parameter is given
})

Решение состоит в том, чтобы поместить все в обратный вызов ИЛИ в цепочку обещаний.

1
Andrea Franchini 28 Май 2019 в 16:00

Я хотел бы сделать: -

try{
  let result = await con.query(checkOffer);
    if (result) {
      let resultFromAnotherQuery = await con.query(sql);
      if (resultFromAnotherQuery){
        console.log("done");
      }
    }
}catch(err) {
   console.log(err);
}
1
Garry 28 Май 2019 в 16:05