Existe alguma maneira de fazer uma chamada síncrona com o AngularJS?
A documentação do AngularJS não é muito explícita ou extensa para descobrir algumas coisas básicas.
EM UM SERVIÇO:
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;
}
Respostas:
Atualmente não. Se você olhar o código-fonte (a partir deste momento, em outubro de 2012) , verá que a chamada para o XHR open é realmente codificada para ser assíncrona (o terceiro parâmetro é verdadeiro):
Você precisaria escrever seu próprio serviço que fazia chamadas síncronas. Geralmente, isso não é algo que você normalmente desejará fazer, devido à natureza da execução do JavaScript, que acabará bloqueando todo o resto.
... mas .. se realmente desejar bloquear todo o resto, talvez você deva procurar promessas e o serviço $ q . Ele permite que você aguarde até que um conjunto de ações assíncronas seja concluído e execute algo quando todas estiverem concluídas. Não sei qual é o seu caso de uso, mas vale a pena dar uma olhada.
Fora isso, se você quiser criar suas próprias, mais informações sobre como fazer chamadas ajax síncronas e assíncronas podem ser encontradas aqui .
Espero que seja útil.
fonte
.then(callback)
. algo como:doSomething(); $http.get('/a/thing').then(doEverythingElse);
.Eu trabalhei com uma fábrica integrada com o Google Maps, preenchimento automático e promessas feitas, espero que você atenda.
http://jsfiddle.net/the_pianist2/vL9nkfe3/1/
você só precisa substituir o serviço de preenchimento automático por esta solicitação por $ http incuida antes da fábrica.
e solicitação de $ http com
a própria pergunta deve ser feita sobre:
quando você tiver feito bem e a solicitação:
quando houver um erro e, em seguida:
fonte
fonte
Recentemente, me deparei com uma situação em que eu queria fazer chamadas de $ http acionadas por um recarregamento de página. A solução que eu usei:
fonte
Aqui está uma maneira de fazer isso de forma assíncrona e gerenciar coisas como faria normalmente. Tudo ainda é compartilhado. Você obtém uma referência ao objeto que deseja atualizar. Sempre que você atualiza isso em seu serviço, ele é atualizado globalmente sem ter que observar ou devolver uma promessa. Isso é muito bom, porque você pode atualizar o objeto subjacente de dentro do serviço sem precisar religar. Usando Angular da maneira como deve ser usado. Eu acho que é provavelmente uma má idéia tornar o $ http.get / post síncrono. Você receberá um atraso perceptível no script.
E em algum lugar da vista:
fonte
Como a sincronização XHR está sendo preterida, é melhor não confiar nisso. Se você precisar fazer uma solicitação de sincronização POST, poderá usar os seguintes auxiliares dentro de um serviço para simular uma postagem de formulário.
Ele funciona criando um formulário com entradas ocultas, que é postado no URL especificado.
Modifique conforme necessário para suas necessidades.
fonte
Que tal encerrar sua chamada em um
Promise.all()
método, ou sejaPromise.all([$http.get(url).then(function(result){....}, function(error){....}])
De acordo com a MDN
fonte