2016-12-26 3 views
0

promiseを返すserviceがあります。複数回呼び出す必要があるデータをフェッチするサービスを設計するにはどうすればよいですか?

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 Lol。うん、それは正しいと思う。あなたは経験豊富な角度のプログラマのようです。あなたはこの質問に対して何か提案していますか? –

答えて

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が回避されます。

関連する問題