Javascript 获取';0';订阅处理程序的字段返回未定义,但显示在控制台中
我有一个问题,当我在Meteor中记录JavaScript对象(订阅处理程序)时,我能够看到字段Javascript 获取';0';订阅处理程序的字段返回未定义,但显示在控制台中,javascript,meteor,javascript-objects,Javascript,Meteor,Javascript Objects,我有一个问题,当我在Meteor中记录JavaScript对象(订阅处理程序)时,我能够看到字段0,但我无法从代码中检索它 我正在使用numtel:mysql包。 以下是用于重现该问题的整个Meteor代码: 自举 Meteor.startup(function() { Meteor.readLiveDb = new LiveMysql(Meteor.Config.mysql.read); Meteor.writeLiveDb = new LiveMysql(Meteor.Con
0
,但我无法从代码中检索它
我正在使用numtel:mysql
包。以下是用于重现该问题的整个Meteor代码: 自举
Meteor.startup(function() {
Meteor.readLiveDb = new LiveMysql(Meteor.Config.mysql.read);
Meteor.writeLiveDb = new LiveMysql(Meteor.Config.mysql.write);
var closeAndExit = function() {
Meteor.readLiveDb.end();
Meteor.writeLiveDb.end();
process.exit();
};
// Close connections on hot code push
process.on('SIGTERM', closeAndExit);
// Close connections on exit (ctrl + c)
process.on('SIGINT', closeAndExit);
});
发布代码
Meteor.publish("checkLoginSubscription", function(username, password) {
if(typeof username === undefined || typeof password === undefined) {
throw new error('Username or password cannot be blank');
return;
}
var user = Meteor.readLiveDb.select(
'select * from users where username = "' + username + '" and password = "' + password + '"', [{
table: 'users'
}]
);
return user;
});
Template.login.events({
'submit #loginform': function(event) {
event.preventDefault();
$('#message').fadeIn();
var username = event.target.username.value;
var password = CryptoJS.MD5(event.target.password.value).toString();
console.log('The Password entered is ', password);
if(username == '' || password == '') {
$('#message').addClass('alert-danger').removeClass('alert-success');
$('#message').html('Username or password cannot be blank');
return;
}
$('#message')
.html('<img src="img/loaders/1.gif" alt="loading" /> Logging you in...')
.addClass('alert-success')
.removeClass('alert-danger');
var cLogin = new MysqlSubscription('checkLoginSubscription', username, password);
console.log(cLogin); // This is the variable holding the object
console.log(cLogin[0]); //undefined!
}
});
事件代码
Meteor.publish("checkLoginSubscription", function(username, password) {
if(typeof username === undefined || typeof password === undefined) {
throw new error('Username or password cannot be blank');
return;
}
var user = Meteor.readLiveDb.select(
'select * from users where username = "' + username + '" and password = "' + password + '"', [{
table: 'users'
}]
);
return user;
});
Template.login.events({
'submit #loginform': function(event) {
event.preventDefault();
$('#message').fadeIn();
var username = event.target.username.value;
var password = CryptoJS.MD5(event.target.password.value).toString();
console.log('The Password entered is ', password);
if(username == '' || password == '') {
$('#message').addClass('alert-danger').removeClass('alert-success');
$('#message').html('Username or password cannot be blank');
return;
}
$('#message')
.html('<img src="img/loaders/1.gif" alt="loading" /> Logging you in...')
.addClass('alert-success')
.removeClass('alert-danger');
var cLogin = new MysqlSubscription('checkLoginSubscription', username, password);
console.log(cLogin); // This is the variable holding the object
console.log(cLogin[0]); //undefined!
}
});
当我尝试获取处理程序的0:Object
部分时,它返回undefined
出什么事了?如何访问此数据?
console.log
对于对象是异步的,因为它只记录一个引用,在您单击它进行扩展时会对其进行评估。(值得注意的是,正如Bergi在评论中指出的那样,第一行捕获了日志调用时对象的当前状态)
因此,这里可能发生的情况是,在日志记录和您在控制台中打开对象之间,某个异步函数正在向数据添加属性0
例如,请参阅和关于该主题的讨论。流星订阅是反应性的东西。
当您强制转换一个时,它开始转到服务器的发布处理程序
本出版物有两种解决方法:
- 发布处理程序
返回一个游标
- 发布处理程序调用其
这向客户机发出信号,表示发布已准备就绪,并且他可以开始使用数据
要跟踪此情况,您必须再次执行以下操作:
- 本机方法:提供回调。但我不确定SQL订阅是否允许这样做
- Meteor way(由于您的屏幕截图,我知道它得到了支持):
ready()
ready()。这意味着你可以用它跑一圈
这些计算是在中本机实现的。
下面是使用本机跟踪程序实现它的另一种方法:
Tracker.autorun(function doStuffOnceDataIsReady() {
if(cLogin.ready()) {
doStuff();
}
});
看到您的用例,您可能想深入研究或。事实上,对象的第一行是记录时的同步捕获,它确实表明数组没有0
属性。Awesome@kyll,让我把这件事做完,然后回去you@Guns如果您以前对Meteor和反应性以及Tracker
和订阅处理不太了解,那么您将需要经历很多!谢谢@kyll,是的,我是meteor的新手,这是我的第一个项目,我被困在登录屏幕上:(@Guns好吧,你正在探索一个完全未知且相当特殊的领域,因此我建议坚持meteor提供的示例和教程以及一些不错的博客(关于或的旧文章)