2012-08-01 85 views
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代碼試圖

+0

'skipnpc'屬於'window'屬性嗎?你在使用Node嗎? – 2012-08-01 16:18:22

+0

不,這是在節點控制檯運行它只是一個可變的我聲明觸發一個if(skipnpc == true){...} – Shawn 2012-08-01 16:18:43

+0

您是否使用javascript'strict'模式? – kidwon 2012-08-01 16:21:33

回答

2

connection.query執行異步之前。因此,在完成之前,您可以到達最後一行。

+0

我不明白這會導致這個問題。但它並沒有解釋如何解決這個問題。 – Shawn 2012-08-01 16:29:04

+0

很難從這段代碼中知道。 skipnpc是用var定義的,還是第一次出現在這裏。爲了確保其餘部分在查詢完成後得到執行,arg stupid註釋編輯器可以將其餘部分封裝在一個函數中,並在查詢體的末尾調用它。 – Roest 2012-08-01 16:39:30

+0

我發現javascript中的節點不像瀏覽器那樣寬容。所以「嚴格使用」當然有助於在出現意想不到的事情之前發現問題。 – Roest 2012-08-01 16:43:22

1

簡單來說,skipnpc保證在您上次登錄console.log(...)時仍爲false。在嘗試查看其結果之前,您沒有任何時間執行connection.query(...)。任何依賴於connection.query(...)的結果的東西都必須作爲回傳給它的回調的一部分來執行;否則當您嘗試訪問它們時,沒有任何結果會進入。

異步編程需要一些習慣。您可能可以使用異步模塊重新組織代碼並使用它的方法,因此所有內容都無法深入嵌套。但是你必須認識到,如果你進行一次異步調用,你的代碼就會流過它。