如何在不手动刷新浏览器的情况下连续更新从服务器到 Web 客户端的随机数据?
How to continuously update random data from server to web client without must manually refresh browser?
我有来自服务器的随机数据,想在不刷新浏览器的情况下将其发送到 Web 客户端。
我将 Web 框架 express.js 与模板引擎 pug.js、socket.io 和 jquery.
一起使用
这是代码:
app.js
var express = require('express');
var socket_io = require('socket.io');
var app = express();
var io = socket_io();
app.io = io;
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
io.on('connection', (socket) => {
socket.emit('random', data);
});
module.exports = app;
routers/index.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
res.render('index');
});
module.exports = router;
views/layout.哈巴狗
doctype html
html
head
title= title
script(src="//code.jquery.com/jquery-1.11.2.min.js")
script(src="//code.jquery.com/jquery-migrate-1.2.1.min.js")
script(src='js/socket.io.js')
body
block content
script(type='text/javascript').
$(document).ready(function() {
var socket = io();
socket.on('connect', onConnect);
function onConnect() {
console.log('socket connected');
}
socket.on('random', function(data) {
for(var keys in data) {
$('#random1').html(`<div>random1: ${data[keys].random1}</div>`);
$('#random2').html(`<div>random2: ${data[keys].random2}</div>`);
}
});
});
views/index.哈巴狗
extends layout
block content
#random1
#random2
对于上面的所有代码,如果我 运行 表示服务器然后变量 randomNum 自动生成随机数并使用 socket.emit 将其发送到 views/layout.pug 并将其传递给 html div。
它工作正常,但之后没有任何改变。
现在我尝试在 app.js
中使用 setInterval 5 秒
// app.js
...
setInterval(() => {
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
}, 5000);
...
如果我 运行 表达服务器并导航到网络浏览器,随机数第一次自动生成,然后我等待了将近 20 秒,没有任何变化。我必须手动刷新浏览器才能更改值。
是setInterval有问题还是我放错地方了?
谁能帮我在不刷新浏览器的情况下自动更改号码?
非常感谢。
已编辑
// app.js
...
setInterval(() => {
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
io.on('connection', (socket) => {
socket.emit('random', data);
});
}, 5000);
...
你不能只更改一个名为 data
的不同变量(不同范围)并期望回调中的函数像 javascript 一样执行 "knows what you want to do"
不过,您的代码很接近
我想你想要这样的东西
var express = require('express');
var socket_io = require('socket.io');
var app = express();
var io = socket_io();
app.io = io;
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
io.on('connection', (socket) => {
socket.emit('random', data); // on connection, everyone gets exactly the same global one-time random data
setInterval(() => { // every 5 seconds, each client gets different random data
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
socket.emit('random', data);
}, 5000);
});
module.exports = app;
好吧,这肯定是糟糕的代码......除非你希望每个人都获得相同的第一个随机数据
const express = require('express');
const socket_io = require('socket.io');
const app = express();
const io = socket_io();
app.io = io;
io.on('connection', socket => {
const sendRandomData = () => {
const random1 = Math.random();
const random2 = Math.random();
const data = [{random1,random2}];
socket.emit('random', data);
};
sendRandomData();
setInterval(sendRandomData, 5000);
});
module.exports = app;
我有来自服务器的随机数据,想在不刷新浏览器的情况下将其发送到 Web 客户端。 我将 Web 框架 express.js 与模板引擎 pug.js、socket.io 和 jquery.
一起使用这是代码:
app.js
var express = require('express');
var socket_io = require('socket.io');
var app = express();
var io = socket_io();
app.io = io;
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
io.on('connection', (socket) => {
socket.emit('random', data);
});
module.exports = app;
routers/index.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
res.render('index');
});
module.exports = router;
views/layout.哈巴狗
doctype html
html
head
title= title
script(src="//code.jquery.com/jquery-1.11.2.min.js")
script(src="//code.jquery.com/jquery-migrate-1.2.1.min.js")
script(src='js/socket.io.js')
body
block content
script(type='text/javascript').
$(document).ready(function() {
var socket = io();
socket.on('connect', onConnect);
function onConnect() {
console.log('socket connected');
}
socket.on('random', function(data) {
for(var keys in data) {
$('#random1').html(`<div>random1: ${data[keys].random1}</div>`);
$('#random2').html(`<div>random2: ${data[keys].random2}</div>`);
}
});
});
views/index.哈巴狗
extends layout
block content
#random1
#random2
对于上面的所有代码,如果我 运行 表示服务器然后变量 randomNum 自动生成随机数并使用 socket.emit 将其发送到 views/layout.pug 并将其传递给 html div。 它工作正常,但之后没有任何改变。
现在我尝试在 app.js
中使用 setInterval 5 秒// app.js
...
setInterval(() => {
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
}, 5000);
...
如果我 运行 表达服务器并导航到网络浏览器,随机数第一次自动生成,然后我等待了将近 20 秒,没有任何变化。我必须手动刷新浏览器才能更改值。
是setInterval有问题还是我放错地方了?
谁能帮我在不刷新浏览器的情况下自动更改号码?
非常感谢。
已编辑
// app.js
...
setInterval(() => {
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
io.on('connection', (socket) => {
socket.emit('random', data);
});
}, 5000);
...
你不能只更改一个名为 data
的不同变量(不同范围)并期望回调中的函数像 javascript 一样执行 "knows what you want to do"
不过,您的代码很接近
我想你想要这样的东西
var express = require('express');
var socket_io = require('socket.io');
var app = express();
var io = socket_io();
app.io = io;
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
io.on('connection', (socket) => {
socket.emit('random', data); // on connection, everyone gets exactly the same global one-time random data
setInterval(() => { // every 5 seconds, each client gets different random data
var randomNum = Math.random();
var randomNum2 = Math.random();
var data = [
{
random1: randomNum,
random2: randomNum2
}
]
socket.emit('random', data);
}, 5000);
});
module.exports = app;
好吧,这肯定是糟糕的代码......除非你希望每个人都获得相同的第一个随机数据
const express = require('express');
const socket_io = require('socket.io');
const app = express();
const io = socket_io();
app.io = io;
io.on('connection', socket => {
const sendRandomData = () => {
const random1 = Math.random();
const random2 = Math.random();
const data = [{random1,random2}];
socket.emit('random', data);
};
sendRandomData();
setInterval(sendRandomData, 5000);
});
module.exports = app;