AngularJS console.log возвращает истинные данные, а затем пустой объект

0

У меня есть завод:

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
angularjs-scope

2 ответа

0
Лучший ответ

Первый случай, который возвращает массив, фактически выполняется вторым. Поток программы выглядит следующим образом:

  1. $scope.map устанавливается на пустой объект фабрикой.
  2. $scope.init вызывается
  3. $http.get отправляет http-запрос на "/api" (но запрос еще не возвращен)
  4. $scope.map печатается в console.log, но пустой объект
  5. В какой-то момент после этого веб-сервер возвращает ваш HTTP-запрос, после чего .success функция .success.
  6. exampleMethod устанавливает $scope.map в массив
  7. $scope.map печатается в console.log, в этот момент это массив
  • 0
    Это правда! Первый журнал, который я вижу в браузере - это пустой объект. Но как я могу реализовать то, что я хочу?
  • 0
    Если вы предоставите больше информации в своем вопросе о том, что вы хотите, я могу посмотреть, как это сделать.
0

Я думаю, что сначала нужно перенастроить пустую первую консоль, а затем массив.

Это связано с тем, что обратный вызов, который вы передаете методу успеха, выполняется асинхронно, когда получен ответ от 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();
});

Это имеет смысл для вас?

Счастливое кодирование!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню