¿Hay alguna forma de hacer una llamada sincrónica con AngularJS?
La documentación de AngularJS no es muy explícita o extensa para descubrir algunas cosas básicas.
EN UN SERVICIO:
myService.getByID = function (id) {
var retval = null;
$http({
url: "/CO/api/products/" + id,
method: "GET"
}).success(function (data, status, headers, config) {
retval = data.Data;
});
return retval;
}
Respuestas:
No actualmente. Si observa el código fuente (a partir de este momento, octubre de 2012) , verá que la llamada a XHR abierto está realmente codificada para ser asíncrona (el tercer parámetro es verdadero):
Tendría que escribir su propio servicio que hiciera llamadas sincrónicas. En general, eso no es algo que normalmente querrá hacer debido a la naturaleza de la ejecución de JavaScript, terminará bloqueando todo lo demás.
... pero ... si realmente se desea bloquear todo lo demás, tal vez debería considerar las promesas y el servicio $ q . Le permite esperar hasta que se realice un conjunto de acciones asincrónicas, y luego ejecutar algo una vez que estén completas. No sé cuál es su caso de uso, pero vale la pena echarle un vistazo.
Fuera de eso, si va a rodar el suyo, puede encontrar más información sobre cómo hacer llamadas ajax síncronas y asíncronas aquí .
Espero que sea de ayuda.
fuente
.then(callback)
. algo así como:doSomething(); $http.get('/a/thing').then(doEverythingElse);
.He trabajado con una fábrica integrada con Google Maps autocompletado y promesas hechas, espero que sirva.
http://jsfiddle.net/the_pianist2/vL9nkfe3/1/
solo necesita reemplazar el autocompleteService por esta solicitud con $ http incuida antes de la fábrica.
y $ http solicitud con
la pregunta en sí debe hacerse sobre:
cuando lo haya hecho bien y la solicitud:
cuando hay un error, y luego:
fuente
fuente
Recientemente me encontré con una situación en la que quería hacer llamadas $ http desencadenadas por una recarga de página. La solución con la que fui:
fuente
Aquí hay una manera de hacerlo asincrónicamente y administrar las cosas como lo haría normalmente. Todo sigue siendo compartido. Obtiene una referencia al objeto que desea actualizar. Cada vez que actualiza eso en su servicio, se actualiza globalmente sin tener que mirar o devolver una promesa. Esto es realmente bueno porque puede actualizar el objeto subyacente desde el servicio sin tener que volver a vincular. Usando Angular de la manera en que debe usarse. Creo que probablemente sea una mala idea hacer que $ http.get / post sincronice. Obtendrá un retraso notable en el guión.
Y en algún lugar de una vista:
fuente
Dado que la sincronización XHR está en desuso, es mejor no confiar en eso. Si necesita hacer una solicitud POST de sincronización, puede usar los siguientes ayudantes dentro de un servicio para simular una publicación de formulario.
Funciona creando un formulario con entradas ocultas que se publica en la URL especificada.
Modifique según sea necesario para sus necesidades.
fuente
¿Qué hay de envolver su llamada en un
Promise.all()
método, es decirPromise.all([$http.get(url).then(function(result){....}, function(error){....}])
De acuerdo con MDN
fuente