Angular.js Factory: Handling $http Asynchronously
The Problem:
When I was using the $http
service to get data from a remote API, the code snippet below was unable to return data back to the controller.
myApp.factory("myFactory", function ($http) {
var data = { anArray: [] }
$http.get("/api").success(function (response) {
data.anArray.push(response)
})
return data
})
This issue arises because the return
statement is executed before the $http
GET request finishes pushing data into the array.
My Solution:
To handle data asynchronously, the controller needs to instruct the service on what actions to take when the data is received later:
myApp.factory("myFactory", function ($http) {
return {
getData: function () {
return $http.get("/api")
},
}
})
myApp.controller("MyController", [
"$scope",
"myFactory",
function ($scope, myFactory) {
$scope.data = []
var handleSuccess = function (response, status) {
$scope.data = response
}
myFactory.getData().success(handleSuccess)
},
])
Let me know if you have any questions. đ