差異

2012-09-12 140 views
3

當我打印我的對象之一(通過AJAX調用創建)到控制檯我得到回:差異

Object 
discreet: Array[2] 
range: Array[2] 
__proto__: Object 

但是,當我手動創建對象我是正確的找回:

Object {range: Array[2], discreet: Array[2]} 
discreet: Array[2] 
range: Array[2] 
__proto__: Object 

有人能向我解釋這兩個對象之間的區別,爲什麼我無法訪問的第一個對象的屬性?

編輯:正被創建的第一個目的:

var obj = {} 

$http.get('/discreet').then(function(data) { obj.discreet = data }); 
$http.get('/range').then(function(data) { obj.range = data }); 

print(obj); 

第二我的手工藝加工:

var obj = { range: [1,2], discreet: [1,2] } 
print(obj); 
+2

如果可能的話,我們還需要查看您的打印電話。 – jvenema

+0

你在另一個瀏覽器中試過了嗎? – Lunatikzx

+0

已更新@jvenema –

回答

1

這是誤解異步編程的一個典型例子。這裏是你需要知道的:

  1. JavaScript是單線程的,所以它一次只能做一件事。

  2. 附接到$http.get.then回調函數是異步 - 它是立即執行。每當Ajax請求從服務器返回時,就排隊等待執行

  3. 直到當前函數完成後才能運行異步回調。他們無法指揮執行線程,但必須耐心等待當前的功能完成使用。

因此,當運行print(obj);obj尚未分配任何屬性,因爲沒有異步回調有機會運行。

如果你看到屬性,當你擴大在控制檯上產生的Object,這是因爲Chrome懶惰提供控制檯中打印的對象的屬性。當你實際點擊展開它的時候它只會詢問對象的屬性(在這個時候回調已經完成)。

1

第一個只是在xhr響應返回之前編輯print,因此該對象在記錄時爲空。

第二個被填充後被記錄。

+1

爲什麼我能夠擴展它以查看從ajax調用中分配的值呢? –

+1

控制檯中的實際底層對象是引用,但打印的「對象」文本在打印時只是一個字符串表示形式。第一次print()調用沒有任何值,因此在「Object」打印文本後沒有數據顯示。當您稍後展開它時,它會*具有值(引用已更新),因此您可以將其展開。 – jvenema