【问题标题】:Pushing query result from back end to front end with interval以间隔将查询结果从后端推送到前端
【发布时间】:2019-12-04 18:30:56
【问题描述】:

我是第一次使用套接字,并创建了一个非常简单的后端和前端,以便在我们的系统上进行测试。

在本例中,我希望后端每 10 秒查询一次我们的服务器,并将结果传递给前端。

我目前将间隔设置为 10 秒,但是当我运行它时,我只能在 10 秒后得到结果 - 我希望立即得到结果,然后每 10 秒检查一次是否有变化。

我尝试过移动代码并查看什么有效,但我通常会收到一条消息,告诉我变量未定义(因为它显然在函数之外。

我的代码在下面-我知道它可能在结果和捕获中设置了间隔,所以如果有人可以帮助整理它以使其正常工作,我将不胜感激。恐怕还是有点菜鸟!

const express = require("express");
const app = express();
const server = require("http").createServer(app);
const io = require("socket.io")(server);
const oledb = require('oledb');

const smartconn =
  `--myodbcconnection--`;
const db = oledb.odbcConnection(smartconn);

let command = `SELECT item FROM mytable.table LIMIT 10`

db.query(command)
.then(result => {
    setInterval(function(){
        io.emit("query", result.result); 
    }, 10000);
},
err => {
    setInterval(function(){
        io.emit("query", err); 
    }, 10000);
});

io.set("origins", "*:*");

io.on("connection", async (socket) => {

console.log("Client Successfully Connected");


});
server.listen(5000, () => {
    console.log("Backend Server is running on http://localhost:5000");
});

预计结果会立即显示。以前旧方法不使用套接字,而是从前端轮询使用设置间隔,我想远离它。

【问题讨论】:

  • 我现在通过将 io.emit 部分放在 io.on 函数中解决了这个问题。

标签: node.js reactjs socket.io


【解决方案1】:

这是一种方法:

//Resolves a Promise after ms milliseconds
const sleep = (ms) => {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms);
    });
}
//Returns a db.query result with server status
const getServerStatus = async () => {
    return await db.query(`SELECT item FROM mytable.table LIMIT 10`);
}
//Runs indefinitely and emits events to frontend every 10 seconds
(async () => {
    while(true){
        try{
            const result = await getServerStatus();
            io.emit("query", result.result); 
        } catch (error){
            io.emit("query", error); //It would be better to change the event name to something else
        }
        await sleep(10000);
    }
})();

这样第一个事件将立即发送,因为与 setInterval 不同,我的实现等待执行代码之后,而不是之前。此外,您可以确保查询在执行时间超过 10 秒时不会重叠。 setInterval 不保证下一次执行会等待上一次执行完成。

缺点是事件将在 (10,000ms + query_delay) 之后发送,因此根据您的数据库大小和性能,其中一些可能会延迟几毫秒或几百毫秒。为了解决这个问题,您可以测量 getServerStatus 的执行时间并将其从等待时间中减去。

【讨论】:

  • 感谢您的回复,但我收到了上述错误:SyntaxError: await is only valid in async function
  • 我编辑了代码并将while循环包装在一个异步函数中。刷新页面并再次检查。
  • 干杯,再看看 - 直到十秒钟后它似乎仍然没有加载。我很感激帮助。嗯,我会继续玩它直到我破解它!
【解决方案2】:

通过将 emit 函数移到 io.on 函数中对其进行排序。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多