如何从其他对象调用回调

时间:2014-02-06 09:14:12

标签: javascript callback

这是我用JavaScript编写的游戏。 我有一个对象(片段)数组,每个对象有多个方法(Method_1 .. Method_N)。同时我还有一些其他函数(gameAI)确定对象应该调用哪些方法。

//Array of objects definition
function gamePiece() {
    this.CallBack = null;
    this.Method_1 = function...
    this.Method_2 = function...
    this.Method_3 = function...
    this.Method_N = function() {
        //do things...
        if( this.CallBack != null ) {
            if( this.CallBack != null) {
                // Question is here
                this.CallBack(); // <-- I do not want this.CallBack, I want that.CallBack()
            }
        }
    }
}

var pieces = new Array();
for(var i=0; i<10; i++) {
    pieces.push = new gamePiece();
}

function gameAI() {
    pieces[4].CallBack = pieces[3].Method_1;   
    pieces[3].CallBack = pieces[2].Method_2;
    pieces[2].CallBack = pieces[1].Method_1;
    pieces[4].Method_2();
}
gameAI();

所以在这个例子中:

第一部分4调用method_2

完成后,第3部分调用method_1

完成后,第2部分调用method_2

完成后,第1部分调用method_1

由于第1部分没有定义回调,因此不再发生

我看到的行为是,当第4部分this.Callback()时,它从本身的上下文而不是第3部分的上下文中调用它。所以看起来Callback存储函数来调用而不是调用者。

为解决此问题,我将代码更改为以下内容:

....
snip
....
pieces[4].CallBack = ({
      Sender: pieces[3]
     ,Method: pieces[3].Method_1
});
....
snip
....
if( this.CallBack != null ) {
    this.CallBack.Sender.????
    ? perhaps some sort of ?
    this.CallBack.Method.call(this.CallBack.Sender)
}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

正如评论中提到的raina77ow,你的逻辑似乎非常复杂。无论如何,解决您遇到的问题的方法是绑定您想要的方法:

pieces[4].CallBack = pieces[3].Method_1.bind(pieces[3]);   

这将确保在执行回调时,它运行的上下文将为pieces[3]

答案 1 :(得分:0)

显然我没有足够的评论意见,所以向StackOverflow维护人员道歉。

@ raina77ow 游戏编程通常非常复杂,我在这里给出的例子被剥离,只是为了传达问题。每个方法都有自己的异步方法和自己的回调。

类似

var methodsToCall = new Array();
methodsToCall.push(...
methodsToCall.push(...
methodsToCall.push(...
...
for(var i in methodsToCall) {
    i();
}

无效。 ---那是你的想法吗?