0

Я пытаюсь присвоить значение функции обратного вызова и отображение ng-repeatасинхронные обратный вызов возвращает нуль

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

+0

@epascarello Какая строка вы укажете. к? – star18bit

+2

посмотреть обратный вызов (userBettedEvent); его не внутри firebaseEventsData.on() обратный вызов – coder

ответ

2

Как @coder уже сказал в комментариях, ваш callback(userBettedEvent) находится не в том месте. Если у вас есть это сейчас, он будет вызываться доon('value' от 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.