Cómo usar $ http promesa respuesta fuera controlador de éxito

$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); 

Recibo una respuesta en successCallback pero no $scope.tempObject fuera de $http . se muestra undefined

Cómo acceder a response o $scope.tempObject después de $http

Pero si quiero usar $ scope.tempObject después de la callback entonces, ¿cómo puedo usarlo? ?

Debes encadenar desde httpPromise. Guarde el httpPromise y devuelva el valor a la función del controlador 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; }); 

Luego fuera de tu cadena desde httpPromise.

 httpPromise.then (function (tempObject) { console.log("Temp Object outside $http ", tempObject); }); 

Para obtener más información, consulte AngularJS $ q Service API Reference: encadenando promesas .

Es posible crear cadenas de cualquier longitud y dado que una promesa se puede resolver con otra promesa (lo que retrasará aún más su resolución), es posible pausar / aplazar la resolución de las promesas en cualquier punto de la cadena. Esto hace posible implementar poderosas API. 1


Explicación de las operaciones asincrónicas basadas en promesas

 console.log("Part1"); console.log("Part2"); var promise = $http.get(url); promise.then(function successHandler(response){ console.log("Part3"); }); console.log("Part4"); 

Foto

El registro de la consola para “Part4” no tiene que esperar a que los datos vuelvan del servidor. Se ejecuta inmediatamente después de que se inicia el XHR. El registro de la consola para “Part3” se encuentra dentro de una función de controlador de éxito que está retenida por el servicio $ q e invocada después de que los datos han llegado del servidor y el XHR finaliza .

Manifestación

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

$ http llamada es llamada asincrónica. La función de callback se ejecuta cuando ha devuelto una respuesta. Mientras tanto, el rest de la función sigue ejecutándose y registra $ scope.tempObject como {}. Cuando se resuelve $ http, solo se establece $ scope.tempObject. Angular enlazará automáticamente el valor modificado mediante el enlace bidireccional.

{{tempObject}} en la vista se actualizará a sí mismo.

si desea utilizar tempObject después de la callback, haga esto

 then(function(data){ onSuccess(data); },function(){ }); function onSuccess(data){ // do something } 

Intenta usar $ scope. $ Apply antes para finalizar la función successCallback. Otra solución es cambiar successCallback -> function así:

 $http({ method: 'GET', url: '/myRestUrl' }).then(function(success) { $scope.tempObject = success; console.log("Temp Object in successCallback ", $scope.tempObject); }, function(error) { });