1

我在使用 oo javascript 时遇到了一些麻烦。我正在创建一个新的对象公共和私有方法。现在当我调用公共方法时,它无法访问私有变量。

我相信我应该return使用公共方法(互联网),但真的不知道为什么。 有人可以解释我错过了什么吗?

function something(){
    var somePanel;  // it is a jquery object to a div

    var createWindow = function(data){
        random.xhr('/chat', 'GET', null, function(res){
            var Container = $("#Container");
            somePanel = $("<div/>").addClass('somePanel').append(res);
            Container.append(somePanel.hide());
        });     
    };

    this.activate = function(){
        somePanel.show().siblings().hide();
    };

    this.init = function(data, fn){
        createWindow(data);
    };
};


connections[data] = new something();  // creates a new something object
connections[data].init(data);   //  which creates just a div object, actually
connections[data].activate();  // has code to show this panel and hide every other panel

当我调用该activate()方法时,它找不到somePanel. 我应该做些什么不同的事情?为什么?

4

2 回答 2

3

异步方法的经典问题。

当您运行时,您的 xhr 处理程序不会被调用activate。您需要等待 xhr 处理程序运行,然后在回调中调用activate

这些方面的东西:

// ...

this.init = function(data, fn){
    createWindow(data, fn);
};

var createWindow = function(data, fn) {
    random.xhr('/chat', 'GET', null, function(res){
        var Container = $("#Container");
        somePanel = $("<div/>").addClass('somePanel').append(res);
        Container.append(somePanel.hide());
        fn();
    });     
};

// ...

connections[data] = new something();
connections[data].init(data, function () { connections[data].activate() });
于 2013-10-26T18:21:41.913 回答
0

您正在将somePanel回调设置为异步调用。你不能保证somePanel在你打电话的时候就设置好了activate()

从 OO 的角度来看, edit meagar 的答案是最佳选择。我的其余答案旨在保持您试图实现的可读性。

您可能想考虑使用允许异步链接(如async)或承诺的模块

于 2013-10-26T18:22:35.347 回答