據我所知,Firebase的snapshot.val()
函數是異步的,但我不確定如何處理/更改我的代碼以解決這種情況。如何處理firebase的異步snapshot.val()函數
總之,這是我的控制器代碼:
.controller('MyController', ['$firebase', '$scope', 'authService', 'rootRef', function(authService, $firebase, $scope, rootRef) {
var auth = authService.getCurrentUser();
$scope.data = [];
if (auth) {
rootRef.on('child_added', function(snapshot) {
console.log(snapshot.val());
$scope.data.push(snapshot.val());
console.log($scope.data);
})
};
從這個代碼,我在控制檯中看到的是這樣的:snapshot.val的
輸出() 輸出的$ scope.data
然而,在console.log(snapshot.val())
和console.log($scope.data)
之間的代碼似乎不運行,因爲我的$ scope.data變量沒有得到更新!
有人可以解釋這種行爲嗎?
我認爲它與snapshot.val()
是異步的事實有關。但更重要的是,有人可以解釋我如何輕鬆解決這個問題,而不是按照我下面的想法做。
我的解決辦法:
我想出了一個辦法讓它工作,這是很婉轉。我所做的是我拿snapshot.name()
,這給我$id
或這個對象的關鍵。然後,我撥打.$asObject().$loaded()
致電$id
(實質上是承諾閱讀該精確對象)。然後,在成功回調中,我更新$scope.data
。
你試過$範圍$ apply()? – webduvet 2014-10-17 10:24:54
從ref獲取快照是異步的。但隨後調用'snapshot.val()'是**同步**,你會立即得到結果。 – 2014-10-17 11:08:13
您的解決方案確實聽起來非常複雜。你可以設置一個jsfiddle/jsbin/plunkr來重現問題嗎? – 2014-10-17 11:12:00