$scope.tempObject = {}; $http({ method: 'GET', url: '/myRestUrl' }).then(function successCallback(response) { $scope.tempObject = response console.log("Temp Object in successCallback ", $scope.tempObject); }, function errorCallback(response) { }); console.log("Temp Object outside $http ", $scope.tempObject);
Eu estou recebendo resposta em successCallback
mas não recebendo $scope.tempObject
fora de $http
. sua exibição undefined
.
Como acessar a response
ou $scope.tempObject
após $http
Mas se eu quiser usar $ scope.tempObject após o retorno de chamada, então como posso usá-lo. ?
Você precisa encadear a partir do httpPromise. Salve o httpPromise e retorne o valor para a function de manipulador onFullfilled.
//save httpPromise for chaining var httpPromise = $http({ method: 'GET', url: '/myRestUrl' }).then(function onFulfilledHandler(response) { $scope.tempObject = response console.log("Temp Object in successCallback ", $scope.tempObject); //return object for chaining return $scope.tempObject; });
Em seguida, fora de sua cadeia do httpPromise.
httpPromise.then (function (tempObject) { console.log("Temp Object outside $http ", tempObject); });
Para obter mais informações, consulte Referência da API do serviço AngularJS $ q – promises de encadeamento .
É possível criar cadeias de qualquer tamanho e, como uma promise pode ser resolvida com outra promise (que adiará sua resolução), é possível pausar / adiar a resolução das promises em qualquer ponto da cadeia. Isso possibilita a implementação de APIs poderosas. 1
console.log("Part1"); console.log("Part2"); var promise = $http.get(url); promise.then(function successHandler(response){ console.log("Part3"); }); console.log("Part4");
O log do console para “Part4” não precisa esperar que os dados retornem do servidor. Ele é executado imediatamente após o início do XHR. O log do console para “Part3” está dentro de uma function de manipulador de sucesso mantida pelo serviço $ q e chamada depois que os dados chegaram do servidor e o XHR é concluído .
console.log("Part 1"); console.log("Part 2"); var promise = new Promise(r=>r()); promise.then(function() { console.log("Part 3"); }); console.log("Part *4*");
Chamada $ http é chamada assíncrona. A function de retorno de chamada é executada quando retorna uma resposta. Enquanto isso, o restante da function continua executando e registra $ scope.tempObject como {}. Quando o $ http é resolvido, apenas $ scope.tempObject é definido. Angular irá vincular o valor alterado automaticamente usando binding bidirecional.
{{tempObject}} na exibição será atualizado automaticamente.
Se você quiser usar tempObject após o retorno de chamada, faça isso
then(function(data){ onSuccess(data); },function(){ }); function onSuccess(data){ // do something }
Tente usar um $ scope. $ Apply antes para concluir a function successCallback. Uma outra solução é alterar successCallback -> function assim:
$http({ method: 'GET', url: '/myRestUrl' }).then(function(success) { $scope.tempObject = success; console.log("Temp Object in successCallback ", $scope.tempObject); }, function(error) { });