返回承诺后访问工厂服务

时间:2016-05-11 09:29:27

标签: javascript angularjs breeze

我正在构建一个AngularJS应用程序并构建了执行ajax请求的服务。通过承诺,一旦满足这些请求,他们就会返回,以获取我的观看所需的数据。

使用$ .Deferred()。then()我可以等到我的请求完成后再在控制器上执行更多代码但是我有一个关于作用域的问题。

我想执行第二个请求,该请求需要使用从第一个收集的一些数据,因此必须等待它的承诺在第二次调用服务之前完成。

问题是我无法在promises .then()函数中访问我的工厂服务,尽管它正确地将其注入控制器。如何在此承诺回报中提供工厂,以便我可以这样第二次调用它?

我的视图控制器功能:

function getCategories() {
        datacontext.getCategories()
            .then(function (data) {
                if (data) {
                    vm.categories = data;
                    categoriesPromise.resolve(data);
                } else {
                    throw new Error('Error obtaining data.');
                }
            })
            .catch(function (error) {
                common.logger.log('error', 'Error obtaining the categories.', error, controllerId);
            })
    }

    function getUsers() {

        // Wait until the categories are loaded
        categoriesPromise.then(function (categories) {
            // I want to use dataContext again here
        })
    }

我想在getUsers()中的categoriesPromise.then()中再次使用getCategories中使用的datacontext。

1 个答案:

答案 0 :(得分:0)

以这种方式创建工厂:

 .factory("MyFactory", ['$q', function ($q) {
             return {
                get: function (_tagName) {
                    var deferred = $q.defer();
                    $http.get(_tagName, function (err, result) {
                        if (err) {
                            return deferred.reject(err);
                        } else if (result) {
                            return deferred.resolve(result);
                        }
                    });
                    return deferred.promise;
                }
}
}])

然后将其注入您的控制器:

.controller('myCtrl', ['$scope','MyFactory',
      function ($scope, MyFactory) {

    $scope,getData = function(){

    var success=function(data){
        console.log("Data return successfully", data);
    },error = function(err){
         console.log("something went wrong", err)
     }

  MyFactory.get("tagName").then(success,error)
};
}]);

我希望这会对你有所帮助。