使用带有angular.js的promise

时间:2015-06-23 15:01:44

标签: javascript angularjs promise

我在前面使用angular.js。

在我的controller.js中我定义了一个将在

中调用的init()方法

我的控制器的初始化。

Init方法定义:

var init = function () {
$scope.callTeamsService();
if ($scope.teams.length == 0){
....
}else{
...
}
.....

};
$ scope.callTeamsService 中的

我填写 $ scope.teams 变量。

$ scope.callTeamsService 方法定义:

$scope.callTeamsService = function(){
        NavService.getTeams(function (response) {
                $timeout(function () {
                    $scope.teams = response;                        
                    }
                }, 200);
            });
    };

在我的service.js中,我定义了一个 getTeams 方法,如下所示:

service.getEquipes = function (callback) {
$http.get(urlBase+'users/' + $rootScope.globals.currentUser.loggedUser.idUser + '/teams')
                    .success(function (response) {
                        callback(response);
                    });
            };

我的问题是当 $ scope.teams.length == 0 条件达到时

我的service.js中的

service.getEquipes 方法尚未调用。

如何在达到 $ scope.teams.length == 0 条件之前修改此代码以完成 $ scope.callTeamsService 方法的执行。

2 个答案:

答案 0 :(得分:2)

  service/factory

   service.getEquipes = function () {
        return $http.get(urlBase+'users/' + $rootScope.globals.currentUser.loggedUser.idUser + '/teams');

        };


 // controller 
    var promise = NavService.getTeams.then (
           function(data) {
             //assign to $scope or do logic
           },
           function(err){
               console.log(err)
           } 
      )

答案 1 :(得分:2)

  

如何修改此代码,以便在达到$scope.callTeamsService条件之前完成$scope.teams.length == 0方法的执行。

错误的方法 - 你需要等待执行$scope.teams.length == 0条件,直到$scope.callTeamsService方法完成。

经典方法是给$scope.callTeamsService方法一个回调参数,并在超时而不是$scope.teams = response;中调用它。然后,您可以将条件放在您传递的回调中的init函数中。

但是,你似乎想要使用promises。为此,所有函数(都是异步的)应return承诺:

service.getEquipes = function (callback) {
    return $http.get(urlBase+'users/' + $rootScope.globals.currentUser.loggedUser.idUser + '/teams');
}

(很简单,$http已经返回承诺)

$scope.callTeamsService = function() {
    return NavService.getTeams().then(function(teams) {
        return $timeout(function() {
            return teams;
        }, 200);
    });
};

(和$timeout也可以这样做 - 通过调用then并从回调中返回它,你可以链接它们并获得两者的新承诺。

function init() {
    return $scope.callTeamsService().then(function(teams) {
        $scope.teams = teams;
        if (teams.length == 0) {
            …
        } else {
            …
        }
    });
}