1

这是一个游戏应用程序,我声明了变量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 代码之前

4

2 回答 2

2

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

于 2012-08-01T16:23:43.273 回答
1

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

异步编程需要一些时间来适应。您也许可以使用 async 模块并使用它的waterfall(...)方法重新组织您的代码,这样一切就不会陷入深度嵌套。但是您必须意识到,如果您进行异步调用,您的代码将直接流过它。

于 2012-08-02T09:50:35.850 回答