我想創建一個客戶可以查看其訂單狀態的實時訂購頁面。如果用戶斷開連接或符合條件,停止方法/間隔
因此,我想每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 –