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;
};