失去全球变量值

时间:2012-08-01 16:16:15

标签: javascript node.js scope

这适用于游戏应用程序 我声明了变量skipnpc,它被设计为一个非玩家角色已经使用过他的指示器,并且跳过了与他的行为相关的任何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代码之前

2 个答案:

答案 0 :(得分:2)

connection.query是异步执行的。因此,在完成之前,您将到达最后一行。

答案 1 :(得分:1)

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

异步编程需要一些时间来习惯。您可以使用异步模块并使用其waterfall(...)方法重新组织代码,这样一切都不会深深嵌套。但是你必须意识到,如果你进行异步调用,你的代码就会直接通过它。