2011-12-07 37 views
0

也许这已经被解决,但是在这里找不到合适的答案。道歉,如果是这样的话。这里的问题:Javascript OOP类 - 将属性赋值给函数

function Aclass(){ 

    this.value1 = "a first value" 
    this.value2 = pulldata() 

    function pulldata(){ 
     $.getJSON("data.json",function(data){ 
      return data 
     }) 
    } 
} 

var obj = new Aclass() 
console.log(obj.value1) 
console.log(obj.value2) 

结果:“第一值”,然后“未定义” 数据变种是不可用了pulldata的范围,我不知道什么是解决这个问题的最好办法。

回答

3

pullData()功能实际上并不返回任何明确的,所以它的返回值是未定义的 - 这意味着当你记录obj.value2时你所看到的是正确的(虽然不合意)。

pullData()您呼叫$.getJSON()并传递一个匿名函数作为回调,这是匿名函数返回data但因为Ajax调用是异步的回报不会去任何地方,并且回调不会发生到后来。

你可以试试这个:

function Aclass(classInitialisedCallback){ 
    var self = this; 

    this.value1 = "a first value"; 
    this.value2 = "not available yet"; 

    $.getJSON("data.json",function(data){ 
     self.value2 = data; 
     if (typeof classInitialisedCallback === "function") 
      classInitialisedCallback(self); 
    }); 
} 

var obj = new Aclass(function(newInstance) { 
    // can use obj or newInstance to refer to the object 
    console.log(obj.value1); 
    console.log(newInstance.value2); 
}); 

也就是说,从$.getJSON()设置您的Aclass()构造带的参数是一个回调函数来执行当类准备就绪,即之后的结果是可用。

+0

没错。伟大的示范,这工作就像它应该。谢谢。 –

1

$ .getJSON对您的“data.json”URL进行异步Ajax调用。你给出的第二个参数是回调函数,当ajax调用完成时调用它。 然而,您的pulldata函数只是在不等待答案的情况下运行,因此返回undefined。

不可能完全按照异步调用的方法来做(你永远不应该使用同步调用)。

您必须重写代码才能在回调中完成您的工作。回调是你的“函数(数据){}”参数。

如果你调用的函数不是异步然而,这是JS的范围是如何工作的,应该已经解决您的问题:

function Aclass() { 
    var that = this; 
    this.value2 = 'not set'; 

    var pullData = function() { 
     someCallToSomethingWithACallback(function() { 
      that.value2 = 'set'; 
     } 
    } 
} 
+0

对。感谢澄清,是有道理的。我怀疑这方面的一些事情。我想首先加载JSON然后在回调中实例化类是正确的。 –