Restangular: ¿esperando la resolución de la promise?

Soy nuevo en Javascript y AngularJS y este me hace rascar la cabeza: /

Condición previa

  • Un service REST que proporciona mis datos desde el backend
  • AngularJS 1.2.21 y Restangular 1.4.0
  • Un controller AngularJS, que solicitará al service una versión mejorada del

Lo que tengo

Este es el método en cuestión:

service.getSlices = function() { Restangular.all('entries').getList().then(function(entries) { //some rather complex modification of the backend data go here //... return resultOfModification; //this is what should be returned for getSlices(); }) //I want the resultOfModification to be returned here }; 

La pregunta

Básicamente me gustaría esperar en getSlices() hasta que la promise se resuelva para poder devolver mi resultOfModification solo cuando realmente se calcule.

Escenario adicional
También podría getSlices() una image para devolver una promise de getSlices() que luego proporcionaría el resultOfModification la resultOfModification . Sin embargo, me temo que no lo entiendo lo suficiente y / o estoy demasiado frustrado / cansado mientras tanto.

Las respuestas y cualquier sugerencia son bienvenidas, especialmente consejos para un buen material de lectura. Gracias

No puede devolverlo en ese lugar como valor real, porque Restangular es asynchronous (la function getSlices se deja antes de que se getSlices la callback que pasa). Es por eso que se usa Promise .

Incluso si fuera posible hacer Restangular para sincronizar, no debería hacer eso porque esto bloqueará el browser hasta que se soliciten los datos, lo que será una mala experiencia para el usuario.

Debería tratar de entrar en Promise ya que fueron diseñados para parecerse al código de synchronization, pero se comportan de forma asíncrona.

Lo que necesitaría cambiar en su código es agregar una return antes del Restangular.all :

  service.getSlices = function() { return Restangular.all('entries').getList().then(function(entries) { //some rather complex modification of the backend data go here //... return resultOfModification; //this is what should be returned for getSlices(); }) }; 

Esto devolverá la Promise que es devuelta por la llamada .then . Esta Protable se resolverá en resultOfModification ya que este es el valor que devuelve desde su callback.

De esa forma podrías usar getSlices esa manera:

  service.getSlices().then(function(modifiedData) { }); 

Las promises se pueden encadenar:

  (new Promise(function( resolve, reject){ setTimeout(function() { resolve("some"); },200); })) .then(function(data) { return data+' data'; }) .then(function(data) { //here a Promise is return which will resovle later (cause of the timeout) return new Promise(function(resolve, reject) { setTimeout(function() { resolve(data+' !!!!!!'); },200); }); }) .then(function(data) { //this will have 'some data !!!!!!' console.log(data); }); 

Que sería lo mismo que si lo escribiera de esa manera:

  var promiseA = new Promise(function( resolve, reject){ setTimeout(function() { resolve("some"); },200); }); var promiseB = promiseA.then(function(data) { return data+' data'; }) var promiseC = promiseB.then(function(data) { //here a Promise is return which will resovle later (cause of the timeout) return new Promise(function(resolve, reject) { setTimeout(function() { resolve(data+' !!!!!!'); },200); }); }); var promiseD = promiseC.then(function(data) { //this will have 'some data !!!!!!' console.log(data); });