【发布时间】:2017-10-19 17:11:26
【问题描述】:
我想创建一个实时订单页面,客户可以在其中查看订单状态。
因此,我想每 10 秒运行一次函数,检查 SQL 数据库是否已准备好订单。
function checkOrder(socket, userid, checkinterval) {
pool.getConnection(function(err, connection) {
// Use the connection
connection.query('SELECT * FROM orders WHERE user = ' + userid + ' ORDER BY timestamp DESC', function(err, rows) {
var alldone = false;
for (var i = 0; i < rows.length; i++) {
if (rows[i]['status'] == 'completed') {
alldone = true;
} else {
alldone = false;
break;
}
}
socket.emit('order-update', rows);
connection.release();
if (alldone) {
console.log('all done');
socket.emit('execute', '$("#orderstatus").html(\'Done\');');
clearInterval(checkinterval);
}
});
});
}
var express = require('express');
var app = express();
var app = express();
var options = {
key: fs.readFileSync('privkey.pem'),
cert: fs.readFileSync('cert.pem'),
ca: fs.readFileSync("chain.pem")
};
var server = require('https').createServer(options, app);
var io = require('socket.io')(server);
var port = 443;
server.listen(port, function() {
console.log('Server listening at port %d', port);
});
io.on('connection', function(socket) {
socket.on('trackorder', function(userid) {
var checkinterval = setInterval(function() {
checkOrder(socket, userid, checkinterval);
}, 10000);
});
socket.on('disconnect', function() {
clearInterval(checkinterval);
});
});
现在,如果作业完成或客户端断开连接,我在停止该功能时遇到问题。
我怎样才能做到这一点?我想clearInterval() 将在函数内部工作,因为它已通过但on disconnect 事件处理程序存在问题。 checkinterval 未定义,或者如果我在全局范围内定义它,它会停止错误的函数。
如何才能正确地做到这一点?
【问题讨论】:
-
不要对异步的东西使用间隔。如果延迟太多,您就会有并发请求在运行。只需使用递归 setTimeout
标签: javascript node.js socket.io setinterval