2014-10-17 68 views
0

據我所知,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

+0

你試過$範圍$ apply()? – webduvet 2014-10-17 10:24:54

+2

從ref獲取快照是異步的。但隨後調用'snapshot.val()'是**同步**,你會立即得到結果。 – 2014-10-17 11:08:13

+0

您的解決方案確實聽起來非常複雜。你可以設置一個jsfiddle/jsbin/plunkr來重現問題嗎? – 2014-10-17 11:12:00

回答

0

您對範圍定義了一個名爲「數據」的數組:

$scope.data = []; 

但是你推到一個名爲您的onComplete回調「測試」變量

$scope.testing.push(snapshot.val()); 
+0

對不起,我希望這很容易。這只是我嘗試更改變量時的一個錯誤,所以它沒有那麼混亂。我會立即修復它。 – jmtoung 2014-10-17 16:57:52

+0

當你在這裏,你可能想要解決你的注射順序。 ['$ firebase','$ scope','authService','rootRef',函數(authService,$ firebase,$ scope,rootRef){...}] – 2014-10-17 17:11:56

+0

讓我們知道您實際上在做什麼獲取child_added事件,並在console.log語句時觸發snapshot.val()和$ scope.data計算出的值。 – 2014-10-17 17:19:01