javascript - AngularJs: $http Llamada sincrónica
Tengo un servicio para llamada API como sigue,
getValue: function(input) {
var deferred, url;
deferred = $q.defer();
url = "url";
$http.post(url, input).success(function(data, status, headers, config) {
return deferred.resolve({
success: true,
data: data,
status: status,
headers: headers,
config: config
});
}).error(function(data, status, headers, config) {
return deferred.resolve({
success: false,
data: data,
status: status,
headers: headers,
config: config
});
});
return deferred.promise;
}
Pero esto es asincrónico. ¿Cómo puedo convertirlo a síncrono (quiero que espere hasta obtener el resultado)?
Respuesta #1
No, eso no es posible con Angular.
Vea https://github.com/angular/angular.js/blob/master/src/ng/httpBackend.js#L51 donde se abre el XMLHttpRequest con
xhr.open(method, url, true);
El tercer parámetro en un xhr.open() se puede establecer en false o true, donde false es síncrono y true es asíncrono. En el caso de Angular, está codificado como true, de modo que todas las llamadas salientes serán asíncronas.
Usa el callback .success() para esperar hasta que la llamada asíncrona devuelva, y luego haz lo que quieras hacer allí.
Según la sugerencia en los comentarios, por supuesto que también puedes hacer las llamadas mediante javascript puro, jQuery o cualquier otra biblioteca que soporte llamadas síncronas, pero aconsejaría usar callbacks/defers con la llamada asincrónica de Angular, porque las llamadas síncronas son bloqueantes y el bloqueo es malo.
