【发布时间】:2016-06-01 20:10:33
【问题描述】:
我正在使用 socket.io 和 MySQL 数据库的 nodejs 服务器上工作,当我意识到当从数据库中检索数据很慢时,数据可能随时发生变化。 例如,在每个套接字连接上,我想在用户发出 X 数据时查询数据库以获取用户的信息。
io.on('connection', function(socket) {
console.log('User connected');
socket.on('fetchTable', function(data) {
var number = data.number;
database.getTable(number, function(error, result) {
// We'll take it that result is constant for both: 1
socket.emit('fetchTableResult', result + number);
});
});
});
如果 2 个用户同时连接(用户 1 的号码:1,用户 2 的号码:2),用户 1 请求数据库 BEFORE 用户 2 但数据库返回用户 1 的结果太慢,首先处理用户 2 的数据。返回的数据会不一样吗?两个用户都会得到 '3' 作为 'fetchTableResult' 数据,对吗?并且套接字现在不会同时是用户 2 的套接字吗?
解决方案?
io.on('connection', function(socket) {
console.log('User connected');
socket.on('fetchTable', function(data) {
var number = data.number;
(function(socket, number) {
database.getTable(number, function(error, result) {
// We'll take it that result is constant for both: 1
socket.emit('fetchTableResult', result + number);
});
})(socket, number)
});
});
如果是这样,如果在 database.getTable 内部,我有另一种方法,例如获取网站的 HTML 内容,这需要一些时间,我是否真的需要在内部进行另一个闭包?
例如:
io.on('connection', function(socket) {
console.log('User connected');
socket.on('fetchTable', function(data) {
var number = data.number;
(function(socket, number) {
database.getTable(number, function(error, result) {
// We'll take it that result is constant for both: 1
(function(socket, result) {
// fetch website html data
socket.emit('fetchTableResult', result + number);
})(socket, result)
});
})(socket, number)
});
});
【问题讨论】:
-
第二个代码块中不需要闭包
-
@JaromandaX 你介意解释一下原因吗?是不是因为我已经在我当前的范围内,没有其他东西可以改变
socket和result的值? -
听起来你知道为什么
标签: javascript node.js closures