|
47 | 47 | * var list = new ExtendedArray(ref); |
48 | 48 | * </code></pre> |
49 | 49 | */ |
50 | | - angular.module('firebase').factory('$firebaseArray', ["$log", "$firebaseUtils", |
51 | | - function($log, $firebaseUtils) { |
| 50 | + angular.module('firebase').factory('$firebaseArray', ["$log", "$firebaseUtils", "$q", |
| 51 | + function($log, $firebaseUtils, $q) { |
52 | 52 | /** |
53 | 53 | * This constructor should probably never be called manually. It is used internally by |
54 | 54 | * <code>$firebase.$asArray()</code>. |
|
631 | 631 |
|
632 | 632 | var def = $firebaseUtils.defer(); |
633 | 633 | var created = function(snap, prevChild) { |
634 | | - var rec = firebaseArray.$$added(snap, prevChild); |
635 | | - $firebaseUtils.whenUnwrapped(rec, function(rec) { |
| 634 | + waitForResolution(firebaseArray.$$added(snap, prevChild), function(rec) { |
636 | 635 | firebaseArray.$$process('child_added', rec, prevChild); |
637 | 636 | }); |
638 | 637 | }; |
639 | 638 | var updated = function(snap) { |
640 | 639 | var rec = firebaseArray.$getRecord($firebaseUtils.getKey(snap)); |
641 | 640 | if( rec ) { |
642 | | - var res = firebaseArray.$$updated(snap); |
643 | | - $firebaseUtils.whenUnwrapped(res, function() { |
| 641 | + waitForResolution(firebaseArray.$$updated(snap), function() { |
644 | 642 | firebaseArray.$$process('child_changed', rec); |
645 | 643 | }); |
646 | 644 | } |
647 | 645 | }; |
648 | 646 | var moved = function(snap, prevChild) { |
649 | 647 | var rec = firebaseArray.$getRecord($firebaseUtils.getKey(snap)); |
650 | 648 | if( rec ) { |
651 | | - var res = firebaseArray.$$moved(snap, prevChild); |
652 | | - $firebaseUtils.whenUnwrapped(res, function() { |
| 649 | + waitForResolution(firebaseArray.$$moved(snap, prevChild), function() { |
653 | 650 | firebaseArray.$$process('child_moved', rec, prevChild); |
654 | 651 | }); |
655 | 652 | } |
656 | 653 | }; |
657 | 654 | var removed = function(snap) { |
658 | 655 | var rec = firebaseArray.$getRecord($firebaseUtils.getKey(snap)); |
659 | 656 | if( rec ) { |
660 | | - var res = firebaseArray.$$removed(snap); |
661 | | - $firebaseUtils.whenUnwrapped(res, function() { |
662 | | - firebaseArray.$$process('child_removed', rec); |
| 657 | + waitForResolution(firebaseArray.$$removed(snap), function() { |
| 658 | + firebaseArray.$$process('child_removed', rec); |
663 | 659 | }); |
664 | 660 | } |
665 | 661 | }; |
666 | 662 |
|
| 663 | + function waitForResolution(maybePromise, callback) { |
| 664 | + var promise = $q.when(maybePromise); |
| 665 | + promise.then(function(result){ |
| 666 | + if (result) { |
| 667 | + callback(result); |
| 668 | + } |
| 669 | + }); |
| 670 | + if (!isResolved) { |
| 671 | + resolutionPromises.push(promise); |
| 672 | + } |
| 673 | + } |
| 674 | + |
| 675 | + var resolutionPromises = []; |
667 | 676 | var isResolved = false; |
668 | 677 | var error = $firebaseUtils.batch(function(err) { |
669 | 678 | _initComplete(err); |
|
677 | 686 | destroy: destroy, |
678 | 687 | isDestroyed: false, |
679 | 688 | init: init, |
680 | | - ready: function() { return def.promise; } |
| 689 | + ready: function() { return def.promise.then(function(result){ |
| 690 | + return $q.all(resolutionPromises).then(function(){ |
| 691 | + return result; |
| 692 | + }); |
| 693 | + }); } |
681 | 694 | }; |
682 | 695 |
|
683 | 696 | return sync; |
|
0 commit comments