[英]How to create a countdown timer and run a sql query with PHP when it is completed?
[英]How to run a query only when another has completed with express js
請對我溫柔一點,我是 node js 的新手。 我在 for 循環中運行兩個查詢,將值插入到名為 orders 和 requests 的兩個表中。 在插入到 orders 表后,我將 insertId 傳遞給變量 orderid,然后將其添加到我的第二個插入查詢中。 一切正常,完成后我想查詢一個名為發票的視圖,以便我可以獲得一些我剛剛放入數據庫的信息。 問題是它甚至在兩個查詢完成之前就從視圖中返回結果,因此我得到一個空響應。 這是我的代碼。
for(var i = 0; i<items.length; i++){
connection.query('INSERT INTO orders(referenceid,itemid,quantity,dac,requestid,locationid) VALUES(?,?,?,?,?,?);',[referenceid,items[i].id,items[i].quantity,dac,requestid,locationid], function(errors,results,fields){
if(errors){ throw errors};
var orderid = results.insertId;
connection.query('INSERT INTO requests(requestid,orderid,price) VALUES(?,?,?)',[requestid,orderid,price],function(errors,results,fields){
})
})
}
connection.query('SELECT * FROM invoice WHERE requestid = ? ,[requestid],function(errors,results,fields){
})
所以任何人都可以幫助我讓 SELECT 查詢僅在 for 循環中的所有插入都完成時運行。 我的數據庫是mysql。
我不確定您使用的是哪個 SQL npm 模塊,因此我無法參考任何文檔,但我相信正在發生的事情是您對connection.query()
調用是異步的,因為它們應該是異步的。 這會導致在 for 循環外的最終connection.query()
在 for 循環內的那些之前執行,因此,您將沒有requestId
在最終查詢中使用。
我可以立即提供的兩種可能的解決方案包括:
因此,對於第一個選項,您可以將最終查詢放入requests
表中查詢的嵌套回調中。 根據我的理解,您只希望在插入orders
和requests
完成后從invoice
選擇行。
至於第二個選項,您可以將 for 循環的內容重構為輔助函數,並使用return new Promise()
封裝它,如下所示:
const helper = (<any_params_you_need>) => {
return new Promise(resolve, reject) => {
for(var i = 0; i<items.length; i++){
connection.query('INSERT INTO orders(referenceid,itemid,quantity,dac,requestid,locationid) VALUES(?,?,?,?,?,?);',[referenceid,items[i].id,items[i].quantity,dac,requestid,locationid], function(errors,results,fields){
if(errors) { reject(err); }
var orderid = results.insertId;
connection.query('INSERT INTO requests(requestid,orderid,price)
VALUES(?,?,?)',
[requestid,orderid,price],function(errors,results,fields){
resolve(results);
})
})
}
}
}
一旦你設置了輔助函數,你就可以像這樣使用await
調用它: await helper();
在您選擇查詢之前。 例如,在調用函數中,它看起來像:
...
const results = await helper();
connection.query('SELECT * FROM invoice WHERE requestid = ? ,[requestid],function(errors,results,fields){});
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.