2012-02-06 53 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關閉的神奇意味着內部匿名函數仍然可以訪問這些局部變量。