2016-07-11 6 views
0

私は(AngularJS handle calling promise multiple times)の前にこの質問をしましたが、今は別の障害があります。今私は都市リストを取得しなければならないが、例外がある。いくつかの例外を除いて約束を複数回呼び出すAngularJSハンドル

都市は、国のように(私の古い質問で)複数回呼び出すことができ、同じデータ(都市)を複数回呼び出すのを防ぐためにデータをキャッシュする必要があります。古い質問の解決策は複数の通話をブロックすることができますが、今では(新しい国の都市のために)いくつかの通話をする必要があります。

私の質問は次のとおりです。 同じデータの呼び出しを防ぐために都市データをキャッシュするにはどうすればよいですか? (My機能は、コールが新しい国の都市のリストのためであるかどうキャッチする必要がありそうならば:。ない場合は、サービスを呼び出すと都市を取得:キャッシュからの戻り都市):

var cityCache = {}; 
vm.getCities = function (countryCode) { 

    if (countryCode!=undefined && !cityCache[countryCode]) { 

     vm.cityPromise = $http({ 
      method: 'POST', 
      cache: true, 
      url: API + '/api/Global/CountryCities', 
      data: { 
       "CountryCode": countryCode 
      } 
     }).then(function successCallback(response,countryCode) { 
      if (errorHandler(response.data)) { 
       console.log("cities come from ajax") 
       cityCache[response.config.data.CountryCode] = response.data; 
       console.log(cityCache) 
       return response.data 
      } 
     }); 
    } else { 
     vm.cityPromise = $timeout(function() {//I use this to get promise object 
      return cityCache[countryCode] 
     }, 0) 
     console.log("cities comes from cache"); 
    } 

    return vm.cityPromise; 
} 
ここ

は私のサービスです

例: 私はgetCities関数を同時に3回呼び出すとしましょう。私はクロムを介して自分のネットワークトラフィックを見ている。私は3つのajax呼び出しを見る。それは正常です。しかし時々、私は同じ都市を求めます。都市データがすでに呼び出されているかどうかを知る関数を編集する必要があります(キャッシュの種類)。私はこの引数を使って3回の機能を尋ねる場合:
は、例えば

私のドイツの都市を1-与える、
私にアイルランドの都市2 - 付け、
(再び)私のドイツの都市3 - 与えます、

3回呼び出しています。しかし、私はドイツに1通、アイルランドに1通を求めます。ちょうど2コール。

+0

質問は不明です。あなたは何をしたいのですか?そして、それはあなたのコードではうまくいきません。 –

+0

ありがとう、私は質問を編集しました。 – Sam

答えて

0

ここにあなた自身の約束を使うことができます。 $ qサービスを注入することを忘れないでください。

var cityCache = {}; 

vm.getCities = function (countryCode) { 

    var deferred = $q.defer(); 
    if (countryCode!=undefined && !cityCache[countryCode]) { 
     vm.cityPromise = $http({ 
      method: 'POST', 
      cache: true, 
      url: API + '/api/Global/CountryCities', 
      data: { 
       "CountryCode": countryCode 
      } 
     }).then(function successCallback(response,countryCode) { 
      if (errorHandler(response.data)) { 
       cityCache[response.config.data.CountryCode] = response.data; 
       deferred.resolve(response.data); 
      } 
      else{ 
       deferred.reject(); 
      } 
     }); 
    } 
    else { 
     vm.cityPromise = $timeout(function() {//I use this to get promise object 
      deferred.resolve(cityCache[countryCode]); 
     }, 0); 
    } 

    return deferred.promise; 
} 
+0

私の古い質問を確認してくださいhttp://stackoverflow.com/questions/38303136/angularjs-handle-calling-promise-multiple-times私もあなたの例で同じ問題を抱えています。 – Sam

0

角度から$qサービスを使用しよう:

同じ都市の複数のコールを防止するために更新

FIDDLE

くださいサービス:

.service("cityService", function($http, $q, $httpParamSerializerJQLike){ 
    //var callCache = {}; 
    var cityCache = {}; 
    return { 
     getCities: function(countryCode){ 

      //if(callCache[countryCode] === undefined){ 
        var promise = $q.defer(); 
      //  callCache[countryCode] = promise; 
      //}else{ 
      //  console.log("return cached promise!!", callCache[countryCode]); 
      //  return callCache[countryCode].promise; 
      //} 

      if (countryCode!=undefined && !cityCache[countryCode]) { 
        console.log("new city"); 
       var data = $httpParamSerializerJQLike({ 
        json: JSON.stringify({ 
         name: countryCode+Math.random().toString(36).substring(7) 
        }) 
       }); 
       $http({ 
        method: 'POST', 
        url:"/echo/json/", 
        data: data 
       }).then(function(risp) { 
         console.log("servicelog",risp.data); 
         cityCache[countryCode] = risp.data; 
        var obj = angular.extend({cache: false}, risp.data); 
        promise.resolve(obj); 
        //callCache[countryCode].resolve(obj); 
        //delete callCache[countryCode]; 
       }); 
      }else{ 
       setTimeout(function(){ 
         var obj = angular.extend({cache: true}, cityCache[countryCode]); 
        promise.resolve(obj); 
        //callCache[countryCode].resolve(obj) 
        //delete callCache[countryCode]; 
       }, 1000) 
      } 
      return promise.promise; 
     } 
    } 
}); 
+0

私の以前の質問http://stackoverflow.com/questions/38303136/angularjs-handle-calling-promise-multiple-timesを確認してください。あなたの事例も同じ問題を抱えています。 – Sam

+0

どこが問題ですか? – Vanojx1

+0

私はgetCities関数を同時に15回呼び出すとしましょう。私はクロムを介して自分のネットワークトラフィックを見ている。私は15のajax呼び出しを見る。それは正常です。しかし時々、私は同じ都市を求めます。都市データがすでに呼び出されているかどうかを知る関数を編集する必要があります(キャッシュの種類)。 例:私はこの引数で3回機能を尋ねる: ドイツの都市を+私にアイルランドの都市を与える+私にドイツの都市をもう一度与えてください、それは3回呼び出しています。しかし、私はドイツに1通、アイルランドに1通を求めます。ちょうど2コール。 – Sam

1

同じ答えをあなたの他の質問として、国にマップするだけです約束するコード。 前と同じですが、エラーの場合を考えてください。

var vm = this; 

vm.cityPromises = {}; 

function getCities(countryCode) { 
    if (!vm.cityPromises[countryCode]) { 
     vm.cityPromises[countryCode] = $http({ 
      method: 'POST', 
      cache: true, 
      url: API + '/api/Global/Countries', 
     }).then(function successCallback(response) { 
      if (errorHandler(response.data)) { 
       console.log("ajax") 
       return response.data; 
      } 
     }); 
    } else { 
     console.log("cache") 
    } 
    return vm.cityPromises[countryCode]; 
} 
+0

答えをありがとう、私はあなたの答えを返す前に私のような私の機能を書いたと働いた! :)私はここでaswerとして私の解決策を書いた。ありがとうございました! – Sam

0

私は:)約束前と今の私を助けるため@Lukeハーパーに多くの感謝のためのオブジェクトを作成することによって、私の問題を解決した彼の答えも正しいですが、私は私のアプリのために少しのコードを追加する必要があります。

あなたは私のコード内の任意の問題が表示されている場合、私はそうここに答え

を編集なるように、私に書いてください、私のソリューションです:

vm.cityPromise = {}; 
vm.getCities = function (countryCode) { 
    vm.cityPromise["cityCache"] = countryCode; 
    if (!vm.cityPromise[countryCode]) { 
     if (countryCode != undefined && !cityCache[countryCode]) { 
      vm.cityPromise[countryCode] = $http({ 
       method: 'POST', 
       cache: true, 
       url: API + '/api/Global/CountryCities', 
       data: { 
        "CountryCode": countryCode 
       } 
      }).then(function successCallback(response, countryCode) { 
       if (errorHandler(response.data)) { 
        cityCache[response.config.data.CountryCode] = response.data; 
        console.log("cities ajax, cityCache", cityCache) 
        return response.data 
       } 
      },function error (response){ 
       console.log ("error:",response) 
      }); 
     } else { 
      vm.cityPromise[countryCode] = $timeout(function() { 
       return cityCache[countryCode] 
      }, 0) 
      console.log("getCities cache"); 
     } 
    } 
    return vm.cityPromise[countryCode]; 
} 
関連する問題