0

我想分配回调函数值和显示ng-repeat异步回调返回null

var myApp = angular.module('mybet',[]); 

myApp.controller('MyBetController', function($scope,$firebase,ProfileFactory,MybetFactory){ 

    $scope.myBetEvents = MybetFactory.getUsersBetsProfile(currentLoggedUser, function(betsData){ 
     //Callback retuning null value here 
     $scope.myBetEvents = betsData; 
    }); 

}); 

myApp.factory('MybetFactory', ['$firebase', function($firebase){ 

    var factory = {}; 

    factory.getUsersBetsProfile = function(userId, callback){ 

     var firebaseRef = new Firebase("https://xxx.firebaseio.com/usersbetsprofile").child(userId); 
     var firebaseBetsRef = new Firebase("https://xxx.firebaseio.com/events"); 
     var userBettedEvent = []; 
     //retrive the data 
     firebaseRef.on('value', function (snapshot) { 
      console.log(snapshot.val()); 
      var data = snapshot.val(); 
      if (data){ 
       //callback(data); 
       angular.forEach(data, function(data){ 
        console.log('For Each getUsersBets',data); 
        var firebaseEventsData = firebaseBetsRef.child(data.event_id); 
        //retrive the data of bets 
        firebaseEventsData.on('value', function (snapshot) {  
         userBettedEvent.push(snapshot.val()); 
         console.log('userBettedEvent',userBettedEvent); 
         //if I call callback here then i get the values but calling callback multipul time is no the option 
       }, function (errorObject) { 
        console.log('The read failed: ' + errorObject.code); 
        }); 
       }); 
       //ISSUE:: callback returing null values 
         callback(userBettedEvent); 
      }else{ 
       console.log('Users has no bets'); 
      } 
     }, function (errorObject) { 
      console.log('The read failed: ' + errorObject.code); 
      }); 
    }; 

    return factory; 
}]) 

查看::

<ul class="list"> 
     <li class="item" ng-repeat="events in myBetEvents">{{events.event_name}}</li> 
</ul> 

如何获取回调()返回鉴于数据并显示? foreach返回null后导致回调的是什么?

+0

您正在等待第一个异步调用完成,但您并未等待SECOND异步调用完成。 – epascarello 2014-09-05 03:02:27

+0

@epascarello你认为哪一行。至?看看回调(userBettedEvent); – star18bit 2014-09-05 03:20:47

+2

;它不在firebaseEventsData.on()回调中 – coder 2014-09-05 04:10:17

回答

2

由于@coder已在评论中说过,您的callback(userBettedEvent)位置不对。您现在拥有它的地方,将在之前Firebase完成之前调用

从评论很显然你已经注意到,但只希望为一个孩子调用回调。你可以简单地使用limit

像这样的工作:

if (data){ 
    data.limit(1).on('value', function(childData) { 
     var firebaseEventsData = firebaseBetsRef.child(childData.event_id); 
     firebaseEventsData.on('value', function (snapshot) {  
      userBettedEvent.push(snapshot.val()); 
      callback(userBettedEvent); 
     } 
    }) 

我还没有真正测试的代码,但我确信一个limit应该让你在正确的方向。

附注:您似乎将Firebase作为传统数据库使用,将数据拉出,就像使用SQL执行操作一样。您可能会注意到:这不是Firebase的自然模型,用于同步数据更改。如果您想坚持提取数据,则可以考虑使用once('value'而不是on('value',以确保每次尝试从Firebase提取数据时处理程序都会触发一次。