簡體   English   中英

如何設計服務以獲取需要多次調用的數據?

[英]How to design services to fetch data that are required to be called multiple times?

我有一項能promiseservice

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.");
});

現在,我的問題是多次調用此服務,並且還需要在其他服務調用上對其進行更新。

編寫控制器部分的最佳方法是什么,以免每次我調用服務時都重復解析承諾?

已經很久了。

但是我只是想回答這個問題。

設計此方法的最佳方法是使用工廠。 因此,這將成為可重用的服務。

示例代碼可以如下:

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.");
});

編寫控制器部分的最佳方法是什么,以免每次我調用服務時都重復解析承諾?

建議不要將承諾保存在服務中,而不必將數據保存在服務中:

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;
});

通過檢查promise並僅在必要時進行提取,多個控制器可以共享數據而無需關心控制器實例化的順序。 這樣可以避免競爭條件和多個XHR到達同一資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM