想检查一下我有一个简单的Web服务资源查询功能吗

//Get country lists
$scope.getCountry = function(){
    $http({
        method  : 'GET',
        url     : cdnLinks('country'),
    }).success(function(data) {
        $scope.countries = data;
    }).error(function(data) {
        console.log(data);
    });
};

//Get profile
$scope.getProfile = function(profile_id, select){
     var formatJSON = {
            profile_id: profile_id,
            select: select,
        };
    var json = JSON.stringify(formatJSON);
    var urlsafe = exEncrypt(json);
    ProfileService.profileActions.query({payload:urlsafe}).$promise.then(function(datas){
        $scope.uProfile = datas[0];
        document.querySelector('title').innerHTML = $scope.uProfile.username;
    });
};

//Initialize update sequence
$scope.initUpdate = function(profile_id, select){
    $scope.getCountry();
    $scope.getProfile(profile_id, select);
}


因此,代码的作用是在用户单击“更新”按钮时,它将触发ng-click="initUpdate(param1, param2)"函数,该函数随后将加载所有函数并向用户显示必要的信息。此功能可以正常运行,但是存在一个问题。因为getCountry()通常返回较大的文件大小[〜3-3.5kb,加载时间〜260 ++ ms服务器依赖]与普通getProfile() [〜1-2 -kb,加载时间〜200 ++ ms服务器依赖],该代码的作用是在加载国家/地区列表之前显示该配置文件,而该国家/地区列表在UI页面中最后会填充一些空白字段。

所以我最初要做的是像这样对getProfile()应用超时

$scope.initUpdate = function(profile_id, select){
    $scope.getCountry();
    $timeout(function(){
        $scope.getProfile(profile_id, select);
    }, 200);
}


暂时工作正常,但由于加载部分与服务器有关,因此我无法具体定义要延迟的时间。

我想检查是否有任何我可以使用/实现的方法


所有要加载和完成的必要资源(getCountry()getInterest()getABCDEFG()和其他一些获取...)
只有getProfile()函数被调用?

最佳答案

您可以使用promise(https://docs.angularjs.org/api/ng/service/ $ q)执行此操作。将$ q依赖项添加到您的控制器,然后在getCountry()和initUpdate()中向我们承诺。

它将继续等待getCountry()请求完成。此外,如果要添加其他请求,可以使用$ q.all()等待多个请求完成,然后再显示配置文件。

$scope.initUpdate = function(profile_id, select){
    $scope.getCountry().then(
        function(){
            $scope.getProfile(profile_id, select);
        }
    );
}

$scope.getCountry = function(){
    var deferred = $q.defer();
    $http({
        method  : 'GET',
        url     : cdnLinks('country'),
    }).success(function(data) {
        $scope.countries = data;
        deferred.resolve();
    }).error(function(data) {
        console.log(data);
        deferred.reject();
    });

    return deferred.promise;
};


(注意:您可以通过直接返回$ http promise来改善代码)

09-25 23:14