如何设计服务来获取需要多次调用的数据?

时间:2016-12-26 11:44:30

标签: javascript angularjs design-patterns

我有service,返回promise

function GetSuggestedPeersService($http, SITE_CONFIG) {
        var getSuggestedPeersService = this;

        var data;

        getSuggestedPeersService.getSuggestedPeersList = function() {
            var baseUrl = SITE_CONFIG.baseUrl + "fetchSuggestedPeers";
            var response = $http({
                method : 'POST',
                url : baseUrl,
                headers : {
                    'Content-Type' : 'application/x-www-form-urlencoded'
                },
                data : data
            });
            return response;
        }

        getSuggestedPeersService.setSuggestedPeers = function(suggestedPeers) {
            getSuggestedPeersService.suggestedPeers = suggestedPeers;
        }

        getSuggestedPeersService.getSuggestedPeers = function() {
            return getSuggestedPeersService.suggestedPeers;
        }

    }

现在我在Controller中使用以下内容来解决这个承诺:

//gets the suggested peers
var promiseSuggestedPeers = GetSuggestedPeersService.getSuggestedPeersList();
promiseSuggestedPeers.then(function (response) {
    peerHealthController.GetSuggPeersShow = response.data;
    GetSuggestedPeersService.setSuggestedPeers(peerHealthController.GetSuggPeersShow);

    return peerHealthController.GetSuggPeersShow;
})
.catch(function (error) {
    console.log("Something went terribly wrong Suggested Peers.");
});

现在我的问题是多次调用此服务,并且还需要在其他服务调用上更新此服务。

编写控制器部分的最佳方法是什么,以便每次调用服务时都不重复解析承诺?

2 个答案:

答案 0 :(得分:1)

已经很久了。

但我只是想回答这个问题。

设计这个的最好方法是使用工厂。所以这将成为一种可重复使用的服务。

示例代码如下:

var httpMethods = peerHealthApp.factory('HttpService',HttpService);

httpMethods.$inject = ['$http', 'SITE_CONFIG'];

function HttpService($http, SITE_CONFIG){
    console.log("SITE_CONFIG from Peer Service: " + SITE_CONFIG);
    var factory = {
            httpGet : function(relativePath,data){
                var baseUrl = SITE_CONFIG.baseUrl + relativePath;
                var response = $http({
                    method : 'GET',
                    url : baseUrl,
                    headers : {
                        'Content-Type' : 'application/x-www-form-urlencoded'
                    },
                    data : data
                });
                return response;

            },
            httpPost : function(relativePath, data){
                var baseUrl = SITE_CONFIG.baseUrl + relativePath;
                var response = $http({
                    method : 'POST',
                    url : baseUrl,
                    headers : {
                        'Content-Type' : 'application/x-www-form-urlencoded'
                    },
                    data : data
                });
                return response;
            }

    };


    return factory;

}

以上可以反复使用,如下所示:

var data=$.param({
    "url":moderatedArticleLink
 });
var promiseURLMetaData = HttpService.httpPost("parseUrlMetadata", data);
promiseURLMetaData.then(function (response) {
    var urlMetaData = response.data;
    return urlMetaData;
    })
.catch(function (error) {
    console.log("Something went terribly wrong while trying to get URL Meta Data.");
});

答案 1 :(得分:0)

  

编写控制器部分的最佳方法是什么,以便每次调用服务时都不重复解析承诺?

我建议保存承诺,而不是将数据保存在服务中:

if ( !Service.get() ) {
    var promise = Service.fetch();
    Service.set(promise);
});

Service.get().then(function (response) {
    $scope.data = response.data;
}).catch( function(errorResponse) {
    console.log(errorResponse.status);
    throw errorResponse;
});

通过检查承诺并且仅在必要时获取,多个控制器可以共享数据而无需关心控制器实例化的顺序。这避免了竞争条件和多个XHR到同一资源。