9

$http を使用しようとしていますが、null の結果が返されるのはなぜですか?

angular.module('myApp')
.factory('sender', function($http) {
    var newData = null;
    $http.get('test.html')
        .success(function(data) {
            newData = data;
            console.log(newData)
        })
        .error(function() {
            newData = 'error';
        });
    console.log(newData)
    return newData
})

コンソールは次のように言います: http://screencast.com/t/vBGkl2sThBd4。newData が最初に null で、次に定義されるのはなぜですか? 正しく行う方法は?

4

2 に答える 2

20

YardenST が言ったように、$httpは非同期であるため、 によって返されるデータに依存するすべての関数または表示ロジックが適切に処理されるようにする必要があります$http.get()$httpこれを達成する 1 つの方法は、以下を返す「約束」を利用することです。

プランカーのデモ

var myApp = angular.module('myApp', []);

myApp.factory('AvengersService', function ($http) {

    var AvengersService = {
        getCast: function () {
            // $http returns a 'promise'
            return $http.get("avengers.json").then(function (response) {
                return response.data;
            });
        }
    };

    return AvengersService;
});


myApp.controller('AvengersCtrl', function($scope, $http, $log, AvengersService) {
    // Assign service to scope if you'd like to be able call it from your view also
    $scope.avengers = AvengersService;

    // Call the async method and then do stuff with what is returned inside the function
    AvengersService.getCast().then(function (asyncCastData) {
            $scope.avengers.cast = asyncCastData;
    });

    // We can also use $watch to keep an eye out for when $scope.avengers.cast gets populated
    $scope.$watch('avengers.cast', function (cast) {
        // When $scope.avengers.cast has data, then run these functions
        if (angular.isDefined(cast)) {          
            $log.info("$scope.avengers.cast has data");
        }
    });
});
于 2013-03-17T11:04:10.007 に答える
5

この JavaScript コードは非同期です。

console.log(newData)
return newData

内部の何の前に実行されるsuccess

newData = data;
console.log(newData)

したがって、最初は newData は null です (null に設定します)。

http 応答が (成功の中で) 返されると、newData は新しい値を取得します。

これは Javascript では非常に一般的です。すべての作業はsuccess.

于 2013-02-03T10:44:32.390 に答える