如何从 MySQL 获取数据并在 30 秒后在 Node.js 中再次获取数据?
How to get data from MySQL and after 30 second fetch it again in Node.js?
我正在尝试做的是根据时间戳从数据库中获取一次数据(称为原点)并等待 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...
}
现在 'recent' 应该是一样的,因为还没有新数据插入数据库。
但我 'recent' 是这样的:
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 部分遗漏了一些东西...
正如您所注意到的,setTimeout
根本不执行异步操作,只是 return 是一个 Timeout 对象。 (await
使用不是 Promise 的东西只会 return 对象本身。)
你会想要这样的东西。 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);
};
我正在尝试做的是根据时间戳从数据库中获取一次数据(称为原点)并等待 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...
}
现在 'recent' 应该是一样的,因为还没有新数据插入数据库。
但我 'recent' 是这样的:
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 部分遗漏了一些东西...
setTimeout
根本不执行异步操作,只是 return 是一个 Timeout 对象。 (await
使用不是 Promise 的东西只会 return 对象本身。)
你会想要这样的东西。 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);
};