cloak javascript angularjs promise restangular angular-promise

javascript - cloak - ng-init



Devuelva inmediatamente una promesa resuelta usando AngularJS (4)

El servicio $ q de AngularJS te ayudará aquí. Es muy parecido a la biblioteca de la promesa Q de Kris Kowal .

Cuando tiene un método asíncrono que puede devolver una promesa o valor, use el método $ q.when . Tomará lo que se le pase, ya sea una promesa o un valor y creará una promesa que se resolverá / rechazará en función de la promesa aprobada, o se resolverá si se aprueba un valor.

$q.when( fooService.update(data_loaded) ).then(function(data){ //data will either be the data returned or the data //passed through from the promise })

y luego en su función de actualización devuelve los datos en lugar de simplemente regresar

if (data_loaded) return data_loaded;

Estoy tratando de entender las promesas en JavaScript (en particular, AngularJS).

Tengo una función en un servicio, llamémoslo fooService , que verifica si hemos cargado algunos datos. Si es así, solo quiero que vuelva, y si no lo hicimos, tenemos que cargar los datos y devolver una promesa:

this.update = function(data_loaded) { if (data_loaded) return; // We''ve loaded the data, no need to update var promise = Restangular.all(''someBase'').customGet(''foo/bar'').then(function(data) { // Do something with the data here } return promise; }

Tengo otra función que luego llama a la función de update de fooService así:

fooService.update(data_loaded).then(function() { // Do something here when update is finished })

Mi problema aquí es que si no necesitamos cargar los datos en la función de update , no se devuelve una promesa, por lo que el .then() no se llama en mi otra función. ¿Cuál debería ser el enfoque aquí - básicamente quiero devolver una promesa resuelta inmediatamente desde la función update() si no necesitamos obtener datos de la llamada Restangular?


Puede usar $q.defer() esta manera:

this.update = function (data_loaded) { var deferred = $q.defer(); if (data_loaded) { deferred.resolve(null); // put something that your callback will know the data is loaded or just put your loaded data here. } else { Restangular.all(''someBase'').customGet(''foo/bar'').then(function(data) { // Do something here when update is finished deferred.resolve(data); } } return deferred.promise; };

Espero que esto ayude.


Como su promesa utiliza la misma sintaxis que la nativa de JavaScript, puede usar y devolver una promesa de JavaScript ya resuelta: Promise.resolve ()

return(Promise.resolve("MyReturnValue"));


La respuesta aceptada actual es demasiado complicada y abusa del patrón anti diferido . Aquí hay un enfoque más simple:

this.update = function(data_loaded) { if (data_loaded) return $q.when(data); // We''ve loaded the data, no need to update return Restangular.all(''someBase'').customGet(''foo/bar'') .then(function(data) { // Do something with the data here }); };

O, aún más:

this._updatep = null; this.update = function(data_loaded) { // cached this._updatep = this._updatep || Restangular.all(''someBase'') // process in .customGet(''foo/bar''); //.then(.. return this._updatep; };