2012-05-02 106 views
1

我有一個非常奇怪的問題。我有一個Backbone集合,我使用where方法在集合中查找與某個特定屬性匹配的模型。我的問題是結果不一致。數組顯示長度爲0有時

我有一個加入的目錄列表,用於跟蹤用戶加入的目標。假設這個集合包含兩個ID爲1和3的目標。當用戶訪問/目標/ 3時,應該顯示一條消息,說明用戶已加入目標

我遇到問題,我正在訪問/目標/ 3,消息顯示時間的一半,而另一半時間,消息不顯示。

奇怪的是,這個問題只發生在我的遠程服務器上,而不是在我的本地主機上。

在我的代碼中,我查詢了3個ID的joinedGoalList,如果匹配,我知道matches數組必須大於0,所以我呈現顯示用戶已加入目標的消息。

下面是代碼(joinedGoalList是骨幹集:

console.log(joinedGoalList); 
    var matches = joinedGoalList.where({id: this.model.get("id")}); 
    console.log(matches); 
    console.log(matches.length); 
    if (matches.length > 0) { 
    console.log("the matches length is > 0"); 
    this.renderLeaveGoal(); 
    } else { 
    console.log("the matches length is 0"); 
    this.renderJoinGoal(); 
    } 

這裏是console.log(joinedGoalList)的結果,這裏的結果(它們是一致的):

child 
_byCid: Object 
_byId: Object 
_callbacks: Object 
length: 2 
models: Array[2] 
__proto__: ctor 

正如你所看到的,長度爲2.其中一個對象的ID爲1,另一個對象的ID爲3.這在整個頁面加載過程中保持一致。

存在不一致rs當我在數組上匹配一個ID爲3的對象時。某些頁面加載找到匹配,而其他頁面加載找不到匹配。

console.log(matches.length)的結果是我的遠程服務器上的0或1,但在我的本地,結果總是1.

+0

「只是發生我的遠程服務器上的」聞起來像一個競爭條件我 –

+4

你確定你不檢查集合之前已經填充了來自服務器的數據?底層的'fetch'畢竟是異步的。 –

+1

我建議還要將集合中模型的ID記錄到控制檯,以便您可以確定您擁有的是什麼。您正在查詢的模型是否確實保存過,或者在那個點上是否有'id'設置?注意,爲什麼在這裏使用'where()' - 爲什麼不使用'joinedGoalList.get(this.model.get('id'))'? – JMM

回答

1

我敢肯定,事件的順序是這樣的:

  1. 您在集合上調用fetch以從服務器加載數據。
  2. 您可以撥打console.log(joinedGoalList),這在某些瀏覽器中是異步的。
  3. 您致電joinedGoalList.where並找到一個空的集合。
  4. fetch來自的呼叫1返回並填充集合。
  5. console.log致電執行並打印出填充的集合,此調用將引用joinedGoalList,並且該引用現在將指向填充的集合。

當你做到這一點本地的AJAX fetch在回報相當快,因此步驟之前,一切行爲you'e期待它發生的方式。

你有幾個選擇這裏:

  1. fetchsuccess回調:

    選項散列接受successerror回調將被傳遞(collection, response)作爲參數。

    所以,你可以使用success回調延遲無論是調用where,直到服務器響應並填充集合。

  2. fetch重置集合:

    當從服務器模型數據返回時,收集將重置。

    reset

    替換的集合與模型一個新的列表(或屬性散列),觸發在最後一個"reset"事件。

    所以,你可以監聽"reset"事件,並使用該事件來觸發無論是打電話where