AngularJS console.log返回true数据,然后返回空对象

时间:2015-08-29 21:31:19

标签: javascript angularjs scope angularjs-scope

我有一家工厂:

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();
});

为什么在第一种情况下它会返回一个数组,但之后什么都不返回?

更新:抱歉,还有另一个问题,我已经解决了。我不会删除答案,因为我收到了正确的答案。

2 个答案:

答案 0 :(得分:0)

返回数组的第一种情况实际上是第二种情况。程序流程如下:

  1. $scope.map由工厂设置为空对象。
  2. $scope.init被称为
  3. $http.get向“/ api”发送http请求(但请求尚未返回)
  4. $scope.map打印到console.log,仍为空对象
  5. 在此之后的某个时刻,Web服务器会返回您的http请求,此时会调用.success函数。
  6. exampleMethod$scope.map设置为数组
  7. $scope.map打印到console.log,此时它是一个数组

答案 1 :(得分:0)

我认为它应该首先在控制台中重新清空,然后是数组。

这是因为当收到GET /api的响应时,您传递给success方法的回调是异步执行的。让我们在你的代码中解释它:

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();
});

这对你有意义吗?

快乐的编码!