У меня есть завод:
app.factory("ExampleFactory", function() {
return {
map: {}
}
});
И контроллер:
app.controller("appCtrl", function($scope, $http, ExampleFactory) {
$scope.map = ExampleFactory.map;
$scope.init = function() {
$http.get("/api") //success
.success(function(result) {
$scope.map = exampleMethod(result);
console.log($scope.map); //{ "1": Object, "2": Object }
});
console.log($scope.map); //Object {}
};
$scope.init();
});
Почему в первом случае он возвращает массив, но затем ничего не возвращает?
ОБНОВЛЕНИЕ: Извините, была другая проблема, и она была решена мной. Я не буду удалять ответ, потому что я получил правильные решения для этого.
Первый случай, который возвращает массив, фактически выполняется вторым. Поток программы выглядит следующим образом:
$scope.map
устанавливается на пустой объект фабрикой.$scope.init
вызывается$http.get
отправляет http-запрос на "/api" (но запрос еще не возвращен)$scope.map
печатается в console.log
, но пустой объект.success
функция .success
.exampleMethod
устанавливает $scope.map
в массив$scope.map
печатается в console.log
, в этот момент это массивЯ думаю, что сначала нужно перенастроить пустую первую консоль, а затем массив.
Это связано с тем, что обратный вызов, который вы передаете методу успеха, выполняется асинхронно, когда получен ответ от GET/api
. Объясните это внутри своего кода:
app.controller("appCtrl", function($scope, $http, ExampleFactory) {
$scope.map = ExampleFactory.map;
$scope.init = function() {
// Get request to the /api
$http.get("/api") //success
// here we instruct it to use our function if success
// but it is not executed until the response is received.
.success(
// Callback that is executed on success HTTP 200
function(result) {
$scope.map = exampleMethod(result);
// Second console.log displayed after receiving
// the response to the $http.get call
console.log($scope.map); //{ "1": Object, "2": Object }
}
/////////////////////////////////////////////////
);
// First console.log will display empty object
console.log($scope.map); //Object {}
};
$scope.init();
});
Это имеет смысл для вас?
Счастливое кодирование!