如何从 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);
};