2014-12-03 118 views
0

所以我試圖通過一個Firebase數據庫來查找符合條件的數據庫中的條目。因此,我使用jQuery的延遲對象來處理數據庫調用。jQuery Deferred僅返回循環中的最後一個值

一旦我從第一個數據庫得到返回值,我想從第二個數據庫獲取第一個數據庫中每個值的用戶信息。然後將結果添加到一個JSON數組

所以它的:

<search for value, find one> 
<<<search other db for oher info>>> 
<continue search for outer value> 

但是,這只是一個返回值 - 儘管一切運行良好(和控制檯日誌的所有信息是正確的)。

下面的代碼:

function find(searchLocation, profileID) { 

var requestUserData = { 
    data: [] 
}; 

var def = $.Deferred(); 

//This will be executed as long as there are elements in the database that match the criteria and that haven't been loaded yet (so it's a simple loop) 
Ref.orderByChild("location").equalTo(searchLocation).on("child_added", function(snapshot) { 
    def.ressolve(snapshot.val().ID); 
}); 
return def.promise(); 
}; 

我希望你們有做什麼或者我怎麼能解決這個問題的任何想法。提前致謝!

編輯:經過進一步測試,我發現這個問題已經存在於外循環 - 所以只有第一個值被返回。我認爲這與resolve()方法的存在有關,但我沒有發現如何改變這種行爲的可能性。

+0

循環中的'notify'和完成時的'resolve' – Johan 2014-12-03 21:40:25

+0

這導致resolve()beeing在查詢的第一次運行結束前執行,因此我得到一個空對象作爲返回值 – chrissik 2014-12-03 21:52:07

+3

詳細說明:找出總數結果集的長度。通知()'完成每個項目。當你達到集合的總長度時,你需要解析延遲對象。 – Johan 2014-12-03 21:54:48

回答

1

Firebase是一個實時數據庫。事件流在服務器上發生變化。您正在嘗試使用此實時模型,並將其強制爲CRUD策略,並對數據執行GET操作。更好的解決方案是在修改後實時更新值。

請參閱AngularFire,ReactFire或BackboneFire瞭解如何使用您最喜愛的綁定框架來實現此目的的示例。

要直接回答這個問題,如果你要檢索的數據的靜態快照,你要與value事件,而不是一個實時的流一次()回調使用來自child_added

Ref.orderByChild("location").equalTo(searchLocation).once("value", function(snapshot) { def.resolve(snapshot.val()); });

相關問題