Express JS Await 不工作 - SQL SELECT 快速(插入之前)

ExpressJS Await not working - SQL SELECT too fast (before INSERT)

我想做一个 SQL 插入,然后是一个 Select 和完整的列表,以在 Vue 中显示,包括新条目。但是 Select 比 Insert 快,并且只执行 return 已经在 Table 中的旧值。我尝试使用 setTimeout 和 Async-Await。 (SQL 语句有效)

谁能帮助我,我是 JS 新手。

async function select_time(datum, mitarbeiter_id){
    let returnQuery = 'SELECT ...'
    let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]);
    pool.query(retquery,(err, data) => {
        if(err) {
            console.error(err);
            return err
        }
 
        return data
    });
}

async function insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit){

    let selectQuery = 'INSERT INTO ...';    
    let query = mysql.format(selectQuery,[taetigkeit, projekt_id, mitarbeiter_id, zeit_von, zeit_bis, stunden, datum]);
    pool.query(query,(err) => {
        if(err) {
            console.error(err);
        }
    });
    if(taetigkeit == 15){
        let updateQuery = "UPDATE ..."
        let query2 = mysql.format(updateQuery, [mitarbeiter_id])
        pool.query(query2,(err, data) => {
        if(err) {
            console.error(err);
        }
        });        
    }
}

async function run_insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit){
    await insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit)
    const jsret = await select_time(datum, mitarbeiter_id)
    return jsret
}

app.get('/insertTime', (req, res) => {
    const datum = req.query.datum;
    const mitarbeiter_id = req.query.mitarbeiter_id;
    let projekt_id = req.query.projekt_id;
    let zeit_von = req.query.zeit_von;
    let zeit_bis = req.query.zeit_bis;
    const stunden = req.query.stunden;
    const taetigkeit = req.query.taetigkeit;

    const js = run_insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit)

    res.json(js)
 })

如果 pool.query 没有与 Promise 支持类似的功能,那么您需要将所有此类调用包装到 promise 中,以便能够等待结果,并且 return 如果需要,它们可以在外面。

async function select_time(datum, mitarbeiter_id){
    let returnQuery = 'SELECT ...'
    let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]);
    return new Promise((resolve, reject) => {
      pool.query(retquery,(err, data) => {
          if(err) {
              console.error(err);
              reject(err);
          }
 
          resolve(data);
      });
    });
}

查看此 answer 以了解有关如何将带有回调的函数转换为 promise-like 函数的更多信息。

扩展@anatoly 的非常好的答案:

我发现内联 return new Promise... 在视觉上扰乱了程序流程。通过创建一个单独的“promisified”版本,您的异步函数变得更加清晰。只是重新整理了代码,最终结果是一样的。

const pQuery = qryText => new Promise((resolve, reject) => {
  pool.query(qryText, (err, data) => {
    if (err) reject(err);
    else resolve(data);
  });
});

然后你的async function就变得很干净了。例如:

async function select_time(datum, mitarbeiter_id){
  let returnQuery = 'SELECT ...'
  let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]);
  const data = await pQuery(retquery);
  return data;
}

旁白:node.js 有 util.promisify,这使得这更容易实现。

const { promisify } = require('util');
const pQuery = promisify(pool.query.bind(pool));

(很确定你需要 bind,但你可以试试看是否有效)