我對 Javascript、nodejs 和 socket io 還是很陌生,到目前為止一切都已經解決了,直到我需要一個從多個表而不是一個表中提取資料的新函式,當它只是一個表時它作業正常,因為我可以發出從函式內部,但是這個新函式需要增加幾次然后發出它,但由于某種原因,我無法從查詢函式內部獲取的資料中增加它。
這是我的功能
socket.on("db_rows", function() {
setInterval(function() {
var rows = 0;
connection.query("SELECT COUNT(id) AS c FROM `systemusage`", function(error, result) {
rows = result[0].c;
});
connection.query("SELECT COUNT(id) AS c FROM `temperature`", function(error, result) {
rows = result[0].c;
});
connection.query("SELECT COUNT(id) AS c FROM `bmp280`", function(error, result) {
rows = result[0].c;
});
console.log(rows);
//var rows = (dbs.a dbs.b dbs.c);
var value = (rows).toLocaleString(
undefined,
{ minimumFractionDigits: 0 }
);
io.emit("db_rows", value);
}, 2000)
});
rows 變數沒有增加,這意味著它rows始終為 0,我無法找到在查詢函式之外獲取獲取資料的方法,有人可以指導我正確的方向嗎?
編輯:我一直在谷歌搜索,但沒有一個答案有幫助。
uj5u.com熱心網友回復:
connection.query不等待結果,因此所有三個呼叫都將立即執行,并且在線上console.log(rows);您將沒有正確的累積值。
您要么需要將所有三個呼叫包裝到 Promise 中,要么使用它們的異步對應項(如果有)。
await new Promise((resolve, reject) => {
connection.query("SELECT COUNT(id) AS c FROM `systemusage`", function(error, result) {
if (error) {
reject(error);
}
rows = result[0].c;
resolve();
});
})
此外,您還需要指出一個回呼setInterval現在是一個異步函式:
setInterval(async function() {
...
})
uj5u.com熱心網友回復:
將查詢合并到一個 SELECT 中怎么樣?喜歡
connection.query("
SELECT * FROM (
SELECT COUNT(id) AS c FROM `systemusage`
SELECT COUNT(id) AS c FROM `temperature`
SELECT COUNT(id) AS c FROM `bmp280`
) c
", function(error, result) {
rows = result[0];
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456480.html
標籤:javascript 节点.js 变量 套接字.io 全局变量
