2012-02-08 62 views
0

我正在構建一個Backbone應用程序,我正在觀察一些我不能放置的行爲。請看下面的集合:在控制檯中的非確定性骨幹集合屬性分配

window.Pictures = Backbone.Collection.extend({ 
    model: Picture, 
    url: 'latest.json', 
    parse: function(response) { 
    this.foobar = 1; 
    }, 
    fetchPage: function() { 
    this.foobar = 2; 
    return this; 
    } 
}); 

在Chrome(或Firefox)控制檯我發出以下命令:

> p = new Pictures(); p.fetch(); p.fetchPage(); 
> p.foobar 
1 

當我這樣做:

> p = new Pictures(); p.fetch() 
> p.fetchPage(); 
> p.foobar 
2 

我真不」不明白這一點。爲什麼第一次執行與第二次執行不同?

回答

1

fetch調用是異步的,因爲它涉及到一個AJAX調用服務器:

collection.fetch([選項])
取模型的默認設置爲這個集合從服務器,他們到達時重置收藏。

而且fetch將調用parse

解析 collection.parse(響應)
解析被稱爲骨幹每當集合的模型是由服務器返回,在fetch

所以p.parse()可之前或之後p.fetchPage()根據時序是你無法控制的問題調用。

在第一種情況:

> p = new Pictures(); p.fetch(); p.fetchPage(); 

fetchPage獲取調用fetch從服務器獲取它的響應和周圍變得調用parse之前,因此調用序列結束這樣的:

  1. 您致電p.fetch()
  2. AJAX調用已完成。
  3. 您致電p.fetchPage()
  4. 收到AJAX響應。
  5. AJAX成功處理程序調用p.parse()

在第二種情況:

> p = new Pictures(); p.fetch() 
> p.fetchPage(); 

相當的時間過去的AJAX調用p.fetchPage()之前返回線之間被稱爲這樣的事情在訂單意外純屬奢望的發生。

如果你需要的東西在一定的順序發生,那麼你就需要使用success(也可能是error)回調fetch提供:

選項散列接受successerror其回調將通過(collection, response)作爲參數。

因此,這應該給你的2一致的結果:

p = new Pictures(); 
p.fetch({ 
    success: function(collection, response) { 
     collection.fetchPage(); 
     console.log(collection.foobar); 
    } 
}); 

當然,如果fetchPage包括AJAX調用,然後你就必須添加回調的另一個層得到一致foobar值。

+0

好的。這很清楚。所以當運行第一個變體1000次時,我應該至少看到正確的結果幾次(我知道,這是不能保證的,但機會接近1)? – harm 2012-02-10 18:43:03

+0

@harm:也許吧。在控制檯中,定時問題非常難以處理和加倍。在返回JSON之前將您的服務器代碼更改爲休眠一秒或兩秒應該會給您更多可預測的結果。 – 2012-02-10 18:47:45

+0

然後我會試一試。謝謝您的幫助。 – harm 2012-02-13 09:01:56