Kash Pourdeilami
Kash Pourdeilami

Reputation: 488

Get length of an array returned by firebase

The usual .length property of the array doesn't work on the arrays returned by firebase. Here is the console.log of the returned array:

0: Object
1: Object
2: Object
3: Object
4: Object
$$added: function () { [native code] }
$$error: function () { [native code] }
$$moved: function () { [native code] }
$$removed: function () { [native code] }
$$updated: function () { [native code] }
$add: function () { [native code] }
$destroy: function () { [native code] }
$getRecord: function () { [native code] }
$indexFor: function () { [native code] }
$inst: function () { [native code] }
$keyAt: function () { [native code] }
$loaded: function () { [native code] }
$remove: function () { [native code] }
$save: function () { [native code] }
$watch: function () { [native code] }
length: 5
__proto__: Array[0]
concat: function concat() { [native code] }
constructor: function Array() { [native code] }
every: function every() { [native code] }
filter: function filter() { [native code] }
findIndex: function (a){if(null==this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof a)throw new TypeError("predicate must be a function");for(var b,c=Object(this),d=c.length>>>0,e=arguments[1],f=0;d>f;f++)if(f in c&&(b=c[f],a.call(e,b,f,c)))return f;return-1}
forEach: function forEach() { [native code] }
indexOf: function indexOf() { [native code] }
join: function join() { [native code] }
lastIndexOf: function lastIndexOf() { [native code] }
length: 0
map: function map() { [native code] }
pop: function pop() { [native code] }
push: function push() { [native code] }
reduce: function reduce() { [native code] }
reduceRight: function reduceRight() { [native code] }
reverse: function reverse() { [native code] }
shift: function shift() { [native code] }
slice: function slice() { [native code] }
some: function some() { [native code] }
sort: function sort() { [native code] }
splice: function splice() { [native code] }
toLocaleString: function toLocaleString() { [native code] }
toString: function toString() { [native code] }
unshift: function unshift() { [native code] }

even the console.log length property shows 5 but for some reason calling the length property returns 0.

Edit:

The length property of the array is set to 5 but the length property of the proto is 0. The .length property returns the 0 value under the proto .

Upvotes: 3

Views: 10111

Answers (1)

David East
David East

Reputation: 32604

Keep in mind that calling $asArray is an asynchronous action.

$scope.notes = $firebase(ref).$asArray();
console.log($scope.notes.length); // the data has not loaded yet

The reason why you're seeing a zero length in the console is because values can change between buffering of the log and printing it, which can be very misleading. Try using a breakpoint to see the values as they execute.

Since the data is asynchronous you'll need to use the $loaded promise.

$scope.notes.$loaded().then(function(notes) {
   console.log(notes.length); // data is loaded here
});

Upvotes: 21

Related Questions