2013-03-29 48 views
0

我有下面的JavaScript對象:JavaScript的AJAX方法:沖洗二傳手

var UsersControl = { 
    users: null, 
    fetchData: function() { 
     $.ajax({ 
      type: "GET", 
      dataType: "json", 
      context: this, 
      url: "../php/client/json.php", 
      data: { 
       type: "users" 
      } 
     }).done(function(response) { 
      this.users = response; 
     }); 
    }, 
    getData: function() { 
     if (this.users == null) { 
      this.fetchData(); 
     } 
     return this.users; 
    } 
}; 

當我運行getData()方法,users場已經被定義,但舊值(null)在此調用返回。在接下來的調用中,返回適當的值(ajax-ed)。例如JavaScript控制檯會話:

> UsersControl 
> Object {users: null, fetchData: function, getData: function} 

> UsersControl.getData() 
> null 

> UsersControl 
> Object {users: Array[2], fetchData: function, getData: function} 

> UsersControl.getData() 
> [Object, Object] 

它看起來像的JavaScript記住對象的當前狀態,當一個方法被調用 - 並且該方法結束後所有的狀態改變將被應用。但是這不可能在運行時運行修改對象字段(就像我之前使用的每種OOP語言一樣)。或者,簡單地說,我有一個地方的錯誤。我很感激這個話題的任何提示。

+0

啊哈,我很少用'console.log'看到'AJAX調用已完成之前返回fetchData'。我能做些什麼來使'fetchData'方法等待ajax調用完成? – ducin

回答

0

愚蠢的我......這是同步的問題...

fetchData: function() { 
    $.ajax({ 
     type: "GET", 
     dataType: "json", 
     context: this, 
     url: "../php/client/json.php", 
     async: false,    // <- note this 
     data: { 
      type: "users" 
     } 
    }).done(function(response) { 
     this.users = response; 
    }); 
},