异步回调返回null
问题描述:
我想分配回调函数值和显示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后导致回调的是什么?
答
由于@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提取数据时处理程序都会触发一次。
您正在等待第一个异步调用完成,但您并未等待SECOND异步调用完成。 – epascarello 2014-09-05 03:02:27
@epascarello你认为哪一行。至?看看回调(userBettedEvent); – star18bit 2014-09-05 03:20:47
;它不在firebaseEventsData.on()回调中 – coder 2014-09-05 04:10:17