2012-02-06 46 views
5
var UsersMenu = function(){ 
    this.returnUsers = []; 
    this.retrieve = function(posts){ 
     var temp = []; 
     $.post("router.php", { "action": "getUsersMenu", "posts" : posts}, 
     function(data) 
     { 
      if(data.response){  
       for(var i=0; i<data.returnUsers.length; i++){ 
        temp.push(data.returnUsers[i]); 
       } 
       this.returnUsers = temp; // i know what 'this' is incorrect 
      } 

     }, "json"); 
       alert(this.returnUsers); 
    } 
} 

2个问题:
1.如何访问从JQ对象(returnUsers)父 '这个'?
2.为什么在jq post之后调用之前调用jq post中的一些警报?对象的对象

+0

你的问题在这个网站上被重复了很多次,如果你搜索的话你可能会找到一个答案(而且两者都应该作为单独的问题提出)。 – 2012-02-06 09:29:08

+0

好的老板,我知道关于搜索的规则,但这是一个匆忙的问题,所以我再次问你 – Abyss 2012-02-06 09:54:58

回答

5

1如何从jq对象(returnUsers)访问父'this'?

你可以捕捉它在一个封闭:

var UsersMenu = function() { 
    this.returnUsers = []; 
    var self = this; 
    this.retrieve = function(posts) { 
     var temp = []; 
     $.post("router.php", { "action": "getUsersMenu", "posts" : posts }, 
     function(data) { 
      if(data.response) { 
       for(var i = 0; i < data.returnUsers.length; i++) { 
        temp.push(data.returnUsers[i]); 
       } 
       self.returnUsers = temp; 
      } 
     }, "json"); 
    } 
}; 

2 JQ后一些警报之前为什么警报后JQ后是哪位?

因为AJAX是异步的。发送AJAX请求的$.post方法会立即返回,但成功回调处理程序将在稍后从服务器接收到响应时执行。所以你不应该把这个警报放在这个成功处理器之外。如果你想消费AJAX调用的结果,这应该只发生在结果可用时的回调中。

+0

非常感谢,伙计。 – Abyss 2012-02-06 09:35:58

0

我可以回答你的第二个问题。

为什么警惕jq post之后调用jq post中的某些警报之前?

由于AJAX是异步的,这意味着您触发了AJAX请求并且不会等待结果。您只需注册一个回调函数并继续执行其余的代码。您的案例中的“其余代码”是alert声明。

这是 极不可能(如果不是不可能的话) 您的AJAX响应不可能在控制到达alert声明之前到达。

+1

响应回来的速度是不相关的。 JavaScript(无论如何,在浏览器中)运行在单线程上,所以除非你使Ajax请求同步,否则Ajax成功回调将在控制到达下一个语句之前调用_never_,事实上所有的当前函数都会首先完成,就像任何函数一样称为当前函数等等。 – nnnnnn 2012-02-06 09:39:36

+0

@nnnnnn谢谢。更新了我的答案。 – adarshr 2012-02-06 09:41:52

0

1 - 使用诸如that可变像

var that = this.returnUsers; 

那么JQ内部功能可按你可以参考它像:

if(data.response){ 
     for(var i=0; i<data.returnUsers.length; i++){ 
      temp.push(data.returnUsers[i]); 
     } 
      that = temp; // Now 'this' is correct 
    } 

2 - 这becouse Ajax调用默认异步 ,意味着javascript解释器不会等待ajax调用完成,并且它将继续执行以下语句,因此请将该警报置于回调函数中。

2
  1. 如何访问从JQ对象(returnUsers)父 '这个'?

你应该把父“这个”像var self = this;回调函数外,再一个局部变量使用self.returnUsers = temp;

  1. 在JQ后一些警报之前为什么警报后JQ后是哪位?

因为AJAX异步工作,但是,对于jQuery.ajax方法,你可以将其设置为通过async: false同步工作。

2

要回答第二个问题:$.post()函数开始异步 Ajax请求。这意味着$.post()函数本身立即返回,并继续执行下一行代码,在此例中为alert()。然后,一旦Ajax请求完成您提供给$.post()的匿名函数,将执行回调,因此如果该函数也包含alert(),则会显示该函数。

至于你的第一个问题:函数中this的值取决于函数的调用方式,而jQuery在调用你的回调函数时通常会设置它,当然它不会将它设置到你的UserMenu对象。最简单的解决方法是保存this的变量是本地的retrieve()函数,然后引用该变量从回调:

var UsersMenu = function(){ 
    this.returnUsers = []; 
    this.retrieve = function(posts){ 
      var self = this, 
      temp = []; 
      $.post("router.php", { "action": "getUsersMenu", "posts" : posts}, 
      function(data) 
      { 
       if(data.response){  
        for(var i=0; i<data.returnUsers.length; i++){ 
         temp.push(data.returnUsers[i]); 
        } 
        self.returnUsers = temp; 
       }    
      }, "json"); 
      alert(this.returnUsers); 
    } 
} 

即使retrieve()功能将由时间完成Ajax的回调运行JavaScript关闭的神奇意味着内部匿名函数仍然可以访问这些局部变量。