angularjs Como usar a resposta promessa $ http fora do manipulador de sucesso




angular-promise angular-http (3)

$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


Tente usar um $ scope. $ Apply antes para concluir a função 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) { }); 

Chamada $ http é chamada assíncrona. A função de retorno de chamada é executada quando retorna uma resposta. Enquanto isso, o resto da função continua executando e registra $ scope.tempObject como {}. Quando o $ http é resolvido, somente $ scope.tempObject é definido. Angular irá vincular o valor alterado automaticamente usando ligação bidirecional.

{{tempObject}} na exibição será atualizado automaticamente.

Se você quiser usar o tempObject após o retorno de chamada, faça isso

then(function(data){
   onSuccess(data);
},function(){

});

function onSuccess(data){
// do something
}

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 função 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 - promessas de encadeamento .

É possível criar cadeias de qualquer tamanho e, como uma promessa pode ser resolvida com outra promessa (que adiará sua resolução), é possível pausar / adiar a resolução das promessas em qualquer ponto da cadeia. Isso possibilita a implementação de APIs poderosas. 1

Explicação das Operações Assíncronas Baseadas em Promessas

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 função de manipulador de sucesso mantida pelo serviço $ q e chamada depois que os dados chegaram do servidor e o XHR é concluído .

Demonstração

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*");

Recursos adicionais





angular-http