2012-01-03 126 views
2

我有一个对象的构造函数:使用jQuery AJAX调用来填充动态对象

function Context(tid) { 
    this.tid = tid; 
    var self = this; 

//We get all the data we need from the server to use in this Context. 
$.post(
    '/review/context/get_context', 
    {tid: tid}, 
    function(data) { 
    results = $.parseJSON(data); 
    if(results.status == "SUCCESS") { 
     self.obj = results.object; 
     self.currenttodo = results.tid 
    } 
    } 
); 

}

我想发起一个文档加载,并使用该对象,直到和事件触发要改变的对象,在这一点上,我想擦除该对象,并用来自不同Ajax调用的信息重新启动它。在这里使用一个对象是可取的,因为有一大堆适用于所有上下文的函数。

$(document).ready(function() { 
    cc = new Context($('#context-tabs').attr('name')); 
    console.log(cc); 
    console.log(cc.currenttodo); 
} 

生成以下控制台输出:

Context 
currenttodo: 14 
obj: Object 
tid: "1" 
__proto__: Context 

undefined 

我觉得这是这个是不是后续功能的执行之前完成asynchonous函数的标准情况下,但我有几个问题:

1)为什么我可以直接在console.log之前直接在console.log中查看cc.currenttodo的值,但无法访问它? 2)为什么Chrome console.log输出对于两个整数不同。 14不是引号和蓝色,而tid:“1”是红色的并用引号引起来。我认为这表明tid是一个字符串,但我想确认一下。 3)如果我不能以这种方式使用异步调用,我将实例化一个唯一对象,以用于从服务器调用填充的调用$ document.ready()函数中?我认为我需要通过成功:函数来完成它,但似乎无法获得除self.variables之外的任何内容吗?

在此先感谢。

UPDATE:SO不会让我回答我自己的问题呢,所以这里是工作代码:

function Context(tid) { 
    this.tid = tid; 
    var self = this; 

    //We get all the data we need from the server to use in this Context. 
    $.ajax({ 
    url: "/review/context/get_context", 
    type: "POST", 
    data: "tid="+self.tid, 
    async: false, 
    dataType: "json", 
    success: function(data) { 
     if(data.status == "SUCCESS") { 
     self.obj = data.object; 
     self.currenttodo = data.tid; 
     } 
    } 
    }); 
} 
+0

内调出一个实例化对象在似乎不可能得到的结果这种情况下,异步通过成功函数回调到实例化对象的范围,但设置async:false有效。我确实需要将jQuery的$ .post调用转换为$ .ajax,但这没什么大不了的: – samtresler 2012-01-03 18:43:40

回答

1

1)假设你要在控制台中点击检查对象,这是因为当你点击的时候,通话已经完成,并且Chrome已经足够了解你正在尝试查看的内容。 console.logs虽然立即发生,所以立即请求cc.currentodo意味着它当时不知道。

2)正确:“1”是一个字符串。检查JSON响应并查看它发送的内容以确认。

3)您可以使用成功功能,也可以同步运行POST。我会说继续在前者工作。一般来说,处理异步时序是棘手的,但一旦你有它的工作,它是非常强大的。

0

用于实例化上述对象的代码示例。正如指出的那样,异步:假是关键,否则你不能泡一个AJAX的结果constucter

function Context(tid) { 
    this.tid = tid; 
    var self = this; 

    //We get all the data we need from the server to use in this Context. 
    $.ajax({ 
    url: "/review/context/get_context", 
    type: "POST", 
    data: "tid="+self.tid, 
    async: false, 
    dataType: "json", 
    success: function(data) { 
     if(data.status == "SUCCESS") { 
     self.obj = data.object; 
     self.currenttodo = data.tid; 
     } 
    } 
    }); 
}