- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为我的 Meteor 客户端启动代码遇到了竞争条件。
简要背景
我正在使用 Meteor 作为 HTML5 游戏大厅界面。当用户通过刷新页面或稍后返回返回菜单时,我希望客户端找到该用户正在进行的任何游戏。但是,我在启动过程中无法访问任何集合。
下面显示了我的 client.js
文件顶部的摘录。
Meteor.subscribe("players"); //Meteor.Collection("players" references Meteor.users via user_id
Meteor.subscribe("games"); // each player has a game_id, linked to Meteor.Collection("games"
if (Meteor.isClient) {
Meteor.startup(function () {
//find the player from the user_id, find game from player.game_id
var current_user_id = Meteor.userId();
var playerFromUser = Players.findOne({"user_id":current_user_id});
if(typeof playerFromUser !== 'undefined'){
var getGame = Games.findOne(playerFromUser.game_id);
if(typeof getGame !== 'undefined'){
alert('game found!'); //is not reached
}else{
alert('game not found'); //is not reached
}
}else{
alert('player not found'); //*********** IS reached. Why? ***********
}
});
}
但是,我可以从 javascript 控制台运行 Players.findOne({"user_id":Meteor.userId());
并且它可以很好地返回有效的 Player。
我的收藏中出现这种竞争状况是怎么回事?
编辑1:
深入研究该库,我发现我错误地认为来自服务器的数据将立即可用。订阅实际上需要一段时间来处理,这就是为什么它们在客户端启动时不可用的原因。我正在更新我的问题以表达这些新信息。
更新的问题
由于我依赖多个订阅来为用户(玩家和游戏)查找游戏,是否有 Meteor 方式来等待两者?仅仅为了获得正在进行的游戏而单独订阅似乎是错误的。根本不需要任何服务器调用。
我觉得应该能够从检索到的玩家和游戏中找到我需要的游戏,而不会再通过任何调用来打扰服务器。
一旦找到自己的解决方案,我就会在这里发布。
最佳答案
好吧,这就是我所拥有的似乎有效的方法:
基本上,我在 session 中添加了在两个订阅的就绪回调上设置的标志。然后,Deps.autorun
函数会监听要设置的 Session 值并执行其余操作。
if (Meteor.isClient) {
Meteor.subscribe("players", function(){
console.log("players_loaded ");
Session.set('players_loaded', true);
}); //linked to Meteor.users with user_id
Meteor.subscribe("games", function(){
console.log("games_loaded ");
Session.set('games_loaded', true);
}); // each player has a game_id
Deps.autorun(function(){
var gamesLoaded = Session.get('games_loaded');
var playersLoaded = Session.get('players_loaded');
if(gamesLoaded && playersLoaded &&
(typeof Players !== 'undefined') && (typeof Games !== 'undefined') ) {
console.log("both loaded! ");
//find the player from the user_id, find game from player.game_id
var playerFromUser = Players.findOne({"user_id":Meteor.userId()});
if(typeof playerFromUser !== 'undefined'){
var getGame = Games.findOne(playerFromUser.game_id);
if(typeof getGame !== 'undefined'){
console.log("game found : " + getGame);
//Do stuff with the game now that we have it
}else{
console.log("no game :(");
}
}else{
console.log("no player :(");
}
}
});
Meteor.startup(function () {
Session.set("title", "whatever else");
Session.set("games_loaded", false);
Session.set("players_loaded", false);
console.log("DOM loaded");
});
}
希望我能帮助别人。
关于javascript - 在 Meteor.startup 的客户端案例中等待多个订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21692201/
我试图在 GCE 上启动时让以下脚本在 CentOS 实例上运行。 我在实例名称上设置了自定义元数据“启动脚本”,并将以下脚本作为值。 该脚本不会在启动、重启或运行/usr/share/google/
我在我的一个类中添加了一个 startUp-Method,它立即退出了我的图像。有没有办法阻止 Photo 执行该方法以便我可以修复它? 最佳答案 不,这是一个持续讨论的问题。见 this post在
我在启动类中收到“'Startup.Configuration' 和'Startup.Configuration' 之间的歧义”错误。我不知道我做了什么导致这个问题。我所做的只是创建了一个 DBCon
asp.net 5 中的 Startup 类让我觉得很奇怪。它不是类 Startup : ISomething 或 Startup : BaseSomething ,其中接口(interface)或基
我有这个代码: https://github.com/nbarbettini/SimpleTokenProvider/tree/master/test/SimpleTokenProvider.Test
这个问题在这里已经有了答案: What does the servlet value signify (11 个答案) 关闭 7 年前。 考虑到同样的问题,我是 J2EE 的新手,请回答。当我们使
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 8年前关闭。 Improve this
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
如何以编程方式查找在设备启动时启动的应用程序列表。有什么方法可以以编程方式禁用您不需要的自动启动应用程序。 谢谢 最佳答案 除了删除有问题的应用程序之外,别无他法。 API 表示系统必须接受对 BOO
我知道它们用于调用 main(),但如果那是唯一目的,那么拥有不同的 crt 文件有什么意义。为什么不使用默认的而不是创建自己的? 最佳答案 CRT 文件是 C 运行时文件。您最有可能遇到的是 crt
我正在运行一个带有在重启时调用的启动脚本的 EC2 实例。此启动脚本在启动容器之前检查 docker 守护进程是否正在运行,但失败并显示错误:Post http:///var/run/docker.s
我有一个项目,其中包含许多具有自己的日志记录的“工具”类。这些日志文件是在应用程序启动时创建的,但在使用之前一直为空。 是否可以告诉logback在启动时不应该创建空文件?但是仅在使用它们时? 不知何
我正在尝试创建自己的自定义钻取功能,其中 URL dynamics://0?myfunction_123456 将启动我自己的代码。 在 C\SysStartupCmd\construct 中,这个基
我有一个 RFID 模块连接到我的 beaglebone 并使用 python 代码读取 ID 标签。现在,我希望我的 python 代码在没有任何命令的情况下登录我的 beaglebone 时直接在
我试图探索一些 ASP.NET-5 应用程序,我在其中找到了 startup.cs 文件。我们在这里设置路由和所有(当然不仅仅针对路由)。我还看到一些演示,其中显示了依赖注入(inject)的使用 h
我遇到以下问题。我有一个带有 UI、nib 等的 Cocoa 应用程序。我需要能够在后台或前台启动该应用程序。换句话说,我需要前者中的 NSApplicationActivationPolicyPro
我在 Windows 上,根据 this startup.el 用于emacs 的启动。但是当我在这个文件中设置代码时(C:\Users\frountch\Progs\emacs24\share\em
asp.net mvc 6 beta5 我尝试使用 config.json 来激活\禁用日志记录 public IConfiguration Configuration { get; set; } p
我一直在查看 ASP.NET Web API 默认项目,它带有 ASP.NET Identity 身份验证,它使用 Owin。我在谷歌上搜索了一下,发现 Owin 旨在将应用程序与服务器分离,并且它的
我是一名优秀的程序员,十分优秀!