Meteor - 在异步调用中设置会话变量

时间:2014-04-20 03:44:15

标签: function session asynchronous callback meteor

我在Meteor.call函数中设置会话变量时遇到问题。似乎Meteor不会将会话变量设置为我在函数范围之外提出的任何变量。

Meteor.startup(function () {
  // code to run on server at startup
  // prompt for name

  var playerName = prompt("Please enter your name:", "");
  Meteor.call('createPlayer', playerName, function(error, result) {
    console.log("PLAYER_ID: " + result);
    Session.set("myPlayerID", result);
    console.log("SESSION_PLAYER_ID: " + Session.get("myPlayerID"));
  });

  console.log("SESSION_PLAYER_ID2: " + Session.get("myPlayerID"));
  Session.set("gameState", SHOW_LOBBY);
});

控制台打印出来:

PLAYER_ID:正确的ID

SESSION_PLAYER_ID:正确的ID

SESSION_PLAYER_ID2:未定义

如您所见,会话变量在函数范围之外不再正确。有什么建议?

1 个答案:

答案 0 :(得分:1)

createPlayer的调用是异步的,因此执行顺序为:

  1. 提示用户
  2. 开始createPlayer
  3. 的调用
  4. log myPlayerID会话变量(SESSION_PLAYER_ID2)
  5. finsh createPlayer的调用:在回调中设置myPlayerID会话变量
  6. 因为(4)将在(3)之后执行,所以在尝试记录" SESSION_PLAYER_ID2"时将得到undefined。如果这是唯一发生的事情(即代码中的其他地方没有错误),您应该能够在浏览器控制台中执行以下操作:

    console.log(Session.get('myPlayerID'));
    

    并且,希望您能得到正确的结果。所以回答你原来的问题:我在这里看不出任何错误 - 会话变量仍然可以在范围之外使用。这似乎只是对异步函数行为的误解。