Skip to content
This repository was archived by the owner on Mar 17, 2025. It is now read-only.

Commit 01cea9c

Browse files
committed
Fixes #617 - $loaded() triggered too soon
Because of promisifying the $$added method, the child_added events were actually being processed internally after the loaded trigger. This occurred because $q.when() actually uses nextTick() internally as well, meaning the child_added events occurred immediately, but then $$process was not called until the second tick occurred; a difficult use case to catch. The $loaded() event, meanwhile, had already triggered on the first tick. Solution was to promisify all the events and then remove the batch() wrapper since they trigger on nextTick() anyway now. So all events are back to firing in order on the next tick.
1 parent 58d32d8 commit 01cea9c

File tree

3 files changed

+40
-26
lines changed

3 files changed

+40
-26
lines changed

src/FirebaseArray.js

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -630,43 +630,39 @@
630630
}
631631

632632
var def = $firebaseUtils.defer();
633-
var created = $firebaseUtils.batch(function(snap, prevChild) {
633+
var created = function(snap, prevChild) {
634634
var rec = firebaseArray.$$added(snap, prevChild);
635-
if( rec ) {
636-
$firebaseUtils.resolve(rec).then(function(rec) {
637-
if( rec ) {
638-
firebaseArray.$$process('child_added', rec, prevChild);
639-
}
640-
});
641-
}
642-
});
643-
var updated = $firebaseUtils.batch(function(snap) {
635+
$firebaseUtils.whenUnwrapped(rec, function(rec) {
636+
firebaseArray.$$process('child_added', rec, prevChild);
637+
});
638+
};
639+
var updated = function(snap) {
644640
var rec = firebaseArray.$getRecord($firebaseUtils.getKey(snap));
645641
if( rec ) {
646-
var changed = firebaseArray.$$updated(snap);
647-
if( changed ) {
642+
var res = firebaseArray.$$updated(snap);
643+
$firebaseUtils.whenUnwrapped(res, function() {
648644
firebaseArray.$$process('child_changed', rec);
649-
}
645+
});
650646
}
651-
});
652-
var moved = $firebaseUtils.batch(function(snap, prevChild) {
647+
};
648+
var moved = function(snap, prevChild) {
653649
var rec = firebaseArray.$getRecord($firebaseUtils.getKey(snap));
654650
if( rec ) {
655-
var confirmed = firebaseArray.$$moved(snap, prevChild);
656-
if( confirmed ) {
651+
var res = firebaseArray.$$moved(snap, prevChild);
652+
$firebaseUtils.whenUnwrapped(res, function() {
657653
firebaseArray.$$process('child_moved', rec, prevChild);
658-
}
654+
});
659655
}
660-
});
661-
var removed = $firebaseUtils.batch(function(snap) {
656+
};
657+
var removed = function(snap) {
662658
var rec = firebaseArray.$getRecord($firebaseUtils.getKey(snap));
663659
if( rec ) {
664-
var confirmed = firebaseArray.$$removed(snap);
665-
if( confirmed ) {
660+
var res = firebaseArray.$$removed(snap);
661+
$firebaseUtils.whenUnwrapped(res, function() {
666662
firebaseArray.$$process('child_removed', rec);
667-
}
663+
});
668664
}
669-
});
665+
};
670666

671667
var isResolved = false;
672668
var error = $firebaseUtils.batch(function(err) {

src/utils.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
batch: function(action, context) {
6262
return function() {
6363
var args = Array.prototype.slice.call(arguments, 0);
64-
$rootScope.$evalAsync(function() {
64+
utils.compile(function() {
6565
action.apply(context, args);
6666
});
6767
};
@@ -182,6 +182,16 @@
182182

183183
resolve: $q.when,
184184

185+
whenUnwrapped: function(possiblePromise, callback) {
186+
if( possiblePromise ) {
187+
utils.resolve(possiblePromise).then(function(res) {
188+
if( res ) {
189+
callback(res);
190+
}
191+
});
192+
}
193+
},
194+
185195
//TODO: Remove false branch and use only angular implementation when we drop angular 1.2.x support.
186196
promise: angular.isFunction($q) ? $q : Q,
187197

@@ -210,7 +220,7 @@
210220
},
211221

212222
compile: function(fn) {
213-
return $timeout(fn||function() {});
223+
return $rootScope.$evalAsync(fn||function() {});
214224
},
215225

216226
deepCopy: function(obj) {

tests/unit/FirebaseArray.spec.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,14 @@ describe('$firebaseArray', function () {
417417
expect(spy).toHaveBeenCalledWith(arr);
418418
});
419419

420+
it('should have all data loaded when it resolves', function() {
421+
var spy = jasmine.createSpy('resolve');
422+
arr.$loaded().then(spy);
423+
flushAll();
424+
var list = spy.calls.argsFor(0)[0];
425+
expect(list.length).toBe(5);
426+
});
427+
420428
it('should reject when error fetching records', function() {
421429
var whiteSpy = jasmine.createSpy('resolve');
422430
var blackSpy = jasmine.createSpy('reject');

0 commit comments

Comments
 (0)