2016-12-26 38 views
0

我有一個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; 
     } 

    } 

現在我用下面的控制器來解決承諾:

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

現在的問題是把這種服務多次,需要更新此上的其他服務電話也是如此。

編寫控制器部件的最佳方式是什麼,以便在每次撥打服務時不重複解析諾言?

+0

你必須是一個Java程序員。只有Java程序員會比代碼中的行數多使用像「suggestedPeers」這樣的名詞。 – georgeawg

+0

@georgeawg哈哈。是的,你說得對。你似乎是一位經驗豐富的角色程序員。你對這個問題有什麼建議嗎? –

回答

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."); 
}); 
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到同一資源。

相關問題