This question already has answers here:
Is this a “Deferred Antipattern”?
                                
                                    (3个答案)
                                
                        
                                2年前关闭。
            
                    
在我的$ routeProvider中,我有一个resolve属性,可以在实例化控制器之前从API获取数据。为什么在将$ q与$ http服务一起使用时,可以将数据传递给控制器​​。他们不是都在做同一件事吗?

这是我无法将数据传递到控制器的原始方法:

AccountService.js



app.factory('AccountService', ['$http', '$q', function ($http, $q) {
    return {
        GetAccounts: function () {
            return $http.get('api/Account/GetAccounts')
            .then(function success(response) {
                return response;
            }, function error(response) {
                ̶r̶e̶t̶u̶r̶n̶ throw console.log("Oops!");
            });
        },
    };
}]);




要将数据传递到控制器,我将GetAccounts更改为:



app.factory('AccountService', ['$http', '$q', function ($http, $q) {
    return {
        GetAccounts: function () {
            var deferred = $q.defer();
            $http.get('api/Account/GetAccounts')
            .then(function (data) {
                deferred.resolve(data.data);
            })
            .catch(function (response) {
                deferred.reject(response);
            })

            return deferred.promise;
        },
    };
}]);




route.js



app.config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/users', {
        template: '<admin accounts="$resolve.accounts"></admin>',
        resolve: {
            accounts: function (AccountService) {
                return AccountService.GetAccounts()
                    .then(function (data) {
                        return data;
                    })
            }
        }
    })
}]);

最佳答案

$ q是Angulars的承诺包装器。 $ http直接返回承诺,因此无论您是直接使用新的$ q还是$ http创建新的承诺,它们都是相同的

09-30 16:28
查看更多