我正在嘗試做的是根據時間戳從 DB 一次(稱為源)獲取資料,然后等待 30 秒在 Node.js 中使用相同的查詢(稱為最近)再次獲取它。
如果 origin 和 recent 是否相等,則比較它們然后根據結果做某事
這是我的代碼:
CREATE TABLE data(
post_id VARCHAR(50) PRIMARY KEY,
post_text TEXT ,
post_img varchar(500),
post_time TIMESTAMP,
);
const finalFn = async () => {
let origin
let recent
origin = await getOg()
recent = await setTimeout(function () {
db.execute( // this one is same function with getOg()
`SELECT * FROM data
WHERE post_time = (SELECT MAX(post_time) FROM data)`
)
.then(data => {
return data[0][0]
})
.catch(err => console.log(err))
console.log("I'm going to get some post")
}, 5000) //5sec
console.log('1', origin)
console.log('2', recent)
console.log(originPost === recent)
}
finalFn()
我很容易得到'oirgin',例如:
{
post_id: '12345',
post_text: 'test',
post_img: null,
post_time: 2022-05-06...
}
“最近”現在應該是相同的,因為還沒有新資料插入資料庫。
但我得到了這樣的“最近”:
Timeout {
_idleTimeout: 5000,
_idlePrev: [TimersList],
_idleNext: [TimersList],
_idleStart: 158,
_onTimeout: [Function (anonymous)],
_timerArgs: undefined,
_repeat: null,
_destroyed: false,
[Symbol(refed)]: true,
[Symbol(kHasPrimitive)]: false,
[Symbol(asyncId)]: 29,
[Symbol(triggerId)]: 0
}
我還在學習異步,所以我想我必須在 settimeout 部分錯過一些東西......
uj5u.com熱心網友回復:
setTimeout正如您所注意到的,根本不做異步,只回傳一個 Timeout 物件。(awaiting 不是 Promise 的東西只會回傳物件本身。)
你會想要這樣的東西。該delay函式是使可等待的常見模式setTimeout。
function delay(number) {
return new Promise((resolve) => setTimeout(resolve, number));
}
async function getOg() {
const res = await db.execute(`SELECT * FROM data WHERE post_time = (SELECT MAX(post_time) FROM data)`);
return res[0][0];
}
const finalFn = async () => {
const origin = await getOg();
await delay(5000);
const recent = await getOg();
console.log("1", origin);
console.log("2", recent);
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471668.html
標籤:javascript mysql 节点.js 异步 异步等待
上一篇:AzureFunctions:無法設定StatusCode,因為回應已經開始
下一篇:單執行緒和異步的混淆
