2015-01-15 5 views
8

Her biri aynı fabrikada $ q/$ http araması yapan iki yönerge var.AngularJS: Yanıt alınmadan önce iki kez aynı REST servisini çağırmaktan kaçının

angular.module("demo").directive("itemA", ["restService", function(restService) { 
    return { 
     restrict: "A", 
     link: function(scope, element, attrs) { 
      restService.get().then(function(response) { 
       // whatever 
      }, function(response) { 
       // whatever 
      }); 
     } 
    }; 
}]); 


angular.module("demo").directive("itemB", ["restService", function(restService) { 
    return { 
     restrict: "A", 
     link: function(scope, element, attrs) { 
      restService.get().then(function(response) { 
       // whatever 
      }, function(response) { 
       // whatever 
      }); 
     } 
    }; 
}]); 

angular.module("demo").factory("restService", ["$http", "$q", function($http, $q) { 
    return { 
     get: function() { 
      var dfd = $q.defer(); 
      $http.get("whatever.json", { 
       cache: true 
      }).success(function(response) { 
       // do some stuff here 
       dfd.resolve(response); 
      }).error(function(response) { 
       // do some stuff here 
       dfd.reject(response); 
      }); 
     } 
    }; 
}]); 

Sorun: Bu

<div item-a></div> 
<div item-b></div> 

yaptığınızda ben ItemB için GET gittiğinde ITEMA gelen GET hâlâ devam ediyor, çünkü aynı web hizmeti, iki kez ateş ettim olsun.

Bu işlemin devam eden bir isteğinin olduğunu bilmek için ikinci bir durumun hangisi olduğu konusunda bir yol var mıdır, böylece bir dakika bekleyebilir ve ücretsiz olarak alabilir mi?

Her URL'yi bekleyen veya beklemeden işaretleyen bir $ http veya $ q sarmalayıcı yapmayı düşündüm, ancak bunun en iyi yol olduğundan emin değilim. Beklemede olsaydım ne yapmalıyım? Sadece varolan vaadini iade et ve diğeri düzeldiğinde çözülecek mi?

+0

Belki de, denetleyicinizde hizmeti bir kez arayabilir ve nesneyi her iki yönergesine de iletebilirsiniz? –

cevap

17

Evet, yapmanız gereken tek şey, söz vermeyi önbelleğe almak ve istek yapıldıktan sonra temizlemek. Aradaki müteakip talep sadece aynı sözü kullanabilir.

angular.module("demo").factory("restService", ["$http", "$q", function($http, $q) { 
    var _cache; 
    return { 
     get: function() { 
      //If a call is already going on just return the same promise, else make the call and set the promise to _cache 
      return _cache || _cache = $http.get("whatever.json", { 
       cache: true 
      }).then(function(response) { 
       // do some stuff here 
       return response.data; 
      }).catch(function(response) { 
       return $q.reject(response.data); 
      }).finally(function(){ 
       _cache = null; //Just remove it here 
      }); 
     } 
    }; 
}]); 
+0

Bu çok yardımcı oldu. Uzun bir günden sonra, zaten yaptığım sözümü geri dönüştürmeyi düşünemedim. Biraz değiştirdim çünkü sıkı moddayız, ama sahip olduğun% 90. – oooyaya

+0

@oooyaya cool. :) İlgili olduğunu düşünüyorsanız cevabımı güncellemekten çekinmeyin. – PSL

+0

nah, sahip olduğunuz şey iyi. garip bir şey vardı. ertelenen modeli kullanırız, böylece sağlayıcıdaki .then sonuçta direktifte direktifte bir. Ancak, .finally() yöntemini kullanarak, sipariş sağlayıcının o zaman, tedarikçinin nihayetinde, direktifin o zaman - o zaman, direktifin o zamana kadar() gittiği zaman, _dfd temizlendi ve havaya uçtu. Yani, biz sadece sağlayıcıda _dfd unset, ama biz çözdükten sonra. Daha iyi bir yol olduğunu hayal ediyorum ama bu sadece bir POC için. – oooyaya

İlgili konular