Cuando queremos paginar los resultados en nuestra plantilla de gadget, utilizamos el enfoque multidatasource que nos permite realizar alguna transformación del servidor como limit, group, select, param, where, ...
En nuestra muestra, podemos obtener los datos página por página con la siguiente instrucción:
vm.from("{{datasource}}").skip(step*bulk).limit(bulk).exec().then
Ahora podemos iterar por los resultados con, por ejemplo, la función asíncrona recursiva iterateResult. Es necesario llamar primero con los parámetros iniciales:
vm.acum = []; var bulk = 1000; var step = 0; iterateResult(vm.acum, step, bulk, callback);
La función callback se llamará cuando se hayan recuperado todos los datos:
//función para hacer algo después de recuperar todos los registros function callback(){ alert("Recuperando " + vm.acum.length + " registros") }
El código completo del ejemplo es el siguiente:
//función asíncrona recursiva para recuperar los datos. Cuando se procesan todos los datos se llama a la función callback function iterateResult(acum,step,bulk,callback){ var acum = acum; var step = step; var bulk = bulk; var callback = callback; //salesimportonto_raw es la datasource vm.from("salesimportonto_raw").skip(step*bulk).limit(bulk).exec().then( function(data){ if(data!=null && data.length>0){//there is more data acum.push.apply(acum, data); step++; iterateResult(acum,step,bulk,callback); } else{//there isn't more data //Paginación acabada, ahora dibujar gráfico u otras cosas callback() } } ) } //función para hacer algo después de recuperar todos los registros function callback(){ alert("Recuperando " + vm.acum.length + " registros") } //Esta función se llamará una vez para initar los componentes vm.initLiveComponent = function(){ vm.acum = []; var bulk = 1000; var step = 0; iterateResult(vm.acum, step, bulk, callback); //Aquí no tenemos el resultado por la función asíncrona };