失去全球variables价值

这是一个游戏应用程序,我声明的variablesskipnpc被devise为一个非玩家angular色已经使用轮到他的行为的任何AI代码跳过一段时间的指标。 我有的问题是我失去skipnpc的价值不知何故,我指出在console.log命令我的问题是关系到可变范围,但我不明白如何解决它。

function npcMovement() { skipnpc = false;... sql4 = "SELECT id FROM game_moblist WHERE spawn_id =" + spawnid + " AND posx=" + parseInt(mobpathx[mobpathx.length - 1]) + " AND posy=" + parseInt(mobpathy[mobpathy.length - 1]) connection.query(sql4, function (err, send, fields) { console.log("skipnpc pathing") io.sockets.emit('groupmoveresult', send, parseInt(mobpathx[mobpathx.length - 1]), parseInt(mobpathy[mobpathy.length - 1])) skipnpc = true console.log("skipnpc=true:" + skipnpc) }); console.log("skipnpc = false:" + skipnpc) 

后来我用

 if (skipnpc==false){ ... 

在尝试进一步的AI代码之前

connection.query是asynchronous执行的。 因此,在完成之前,您可以到达最后一行。

简单来说, skipnpc保证在你上一次console.log(...)时仍然是false的。 在尝试查看其结果之前,您没有任何时间执行connection.query(...) 。 任何依赖于connection.query(...)结果的东西都必须作为你传递给它的callback的一部分来执行; 否则当您尝试访问它们时,没有任何结果会进来。

asynchronous编程需要一些习惯。 您可能可以使用asynchronous模块并使用其waterfall(...)方法重新组织代码,因此一切都不会完全嵌套。 但是你必须认识到,如果你打一个asynchronous调用,你的代码将会stream过它。