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
,但你可以试试看是否有效)
我想做一个 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
,但你可以试试看是否有效)