2015-11-04 46 views
0

我遇到了在回調中設置值的問題。我最初撥打電話獲取Quest數據,然後在任務數據返回後致電game.state.setNPCs無法獲得在回調中設置的值

我想在設置好NPC對象之後,但即使setNPCs()似乎在設置數組,但get仍返回一個空數組。

您可以在下面看到,在callback後面設置result.npcs,我註銷了getNPCs(),它是一個空陣列。

更奇怪的是,在設置了值之後,我從GameState對象中調用game.state.getNPCs(),但它仍然是一個空數組。

編輯:我發現,如果我在game.state.getNPCs傳遞作爲一個回調到初始回調setNPCs(),就像這樣:

callback(result.npcs, game.state.getNPCs); 

那麼這個工程...但我不希望有傳在另一個回調。見下文。


game.state.setNPCs回調初始呼叫:

Utilities.game.quest.getQuestData({ id : stat.quest_id }, game.state.setNPCs); 

電話getQuestData:

getQuestData : function (params, setNPCcallback) { 

    API.Quest.getQuestData(params).done(function (result) { 

     if (game.state) { 

      game.state.setQuest(result); //Object received successfully 

      setNPCcallback(result.npcs, game.state.getNPCs); 

      console.log('NPCs', game.state.getNPCs()); //Empty array 
     } 
    }); 
}, 

遊戲狀態對象:

var GameState = function(args) { 
     this.npcs = []; 
     ... 
}; 

GameState.prototype = { 

    constructor : GameState, 

    getNPCs : function() { 
     console.log(this.npcs); //Empty array 
     return this.npcs; 
    }, 

    setNPCs : function (npcsArray, getNPCcallback) { 
     this.npcs = npcsArray; 
     console.log(this.npcs); //Contains Object 
     console.log(game.state.getNPCs()); //Empty array 
     console.log(getNPCcallback()); //Contains Object 
    }, 
+0

你在哪裏調用'setNPCs' ..? –

+0

@TJ在最初的'getQuestData'中,我傳入一個回調'Utilities.game.quest.getQuestData({id:stat.quest_id},game.state.setNPCs);'。查看帖子頂部 – Growler

+0

@TJ也見上面編輯。如果我將'game.state.getNPCs'作爲回調函數傳入'game.state.setNPCs',它就會起作用......但是這看起來很糟糕,我想知道爲什麼我不能在'setNPCs'之後獲取值被稱爲。這不像它從服務器上再次獲取數據。 – Growler

回答

1

我做了一個小的演示,測試問題。

var Person = function() { 
    this.name = "someone"; 
} 
Person.prototype.walk = function() { 
    console.log(this) 
}; 
var p = new Person; 

function exec(callback) { 
    callback(); //context is Window 
    callback.call(p); //context is Person {name: "someone"} 
} 
p.walk(); //context is Person {name: "someone"} 
exec(p.walk); 

當您從getQuestData調用回調,上下文不GameState實例。使用callapply方法使用正確的上下文調用回調,或使用bind方法使用回調綁定更正上下文應該解決問題。

否則,您可以通過GameState實例本身並調用gameState.callbackMethod()

這看起來應該根據前面的例子以下

function exec(instance) { 
    instance.walk(); //context is Person {name: "someone"} 
} 
exec(p); 
+0

謝謝!哎呀忘了上下文 – Growler