2016-03-29 6 views
1

Ich habe eine Fabrik, wo ich Daten von einem Server bekommen die $ http Methoden verwenden:Angular JS rettenden Informationen von der Fabrik AJAX Anfrage

.factory('$factory', function ($q, $http, $timeout, $state, $ionicHistory, $localstorage) { 
    var obj = []; 

    var functions = { 
    getData: function() { 

     var dfd = $q.defer(); 
     if(!obj){ 
     $http({ 
      url: remoteUrl+'/getdata', 
      method: 'POST', 
      data: {} 
     }).then(function(response) { 
      $timeout(function(){ 
      obj = response.data; 
      dfd.resolve(response.data); 
      }, 2000) 
     }, function(response) { 

     } 
     }else{ 
     return obj; 
     } 
     return dfd.promise; 
    } 
    } 
} 

Also das die Daten erhält und setzt es in ein Objekt. Korrigiere mich, wenn ich falsch liege, aber diese Methode der Verwendung einer Fabrik für diese Art von Aktion ist so, dass sie nicht an einen Controller gebunden ist und überall in meiner Anwendung verwendet werden kann.

In diesem Sinne möchte ich es schaffen, damit ich die Daten überall in meiner App erhalten kann, ohne jedes Mal den Server abfragen zu müssen. d. h. sobald der Server abgefragt wird, speichert die Fabrik die Antwort auf ein Objekt (so wie ich es jetzt mache). Aber ich habe Probleme beim späteren Zugriff auf die Daten in einem anderen Controller.

Ich habe begonnen, was ich denke, sollte es aussehen, indem Sie die if (! Obj) -Zeile, aber in der else-Anweisung kann ich nicht einfach das Obj-Objekt zurückgeben. Es wirft Fehler aus, da es kein Versprechen gibt, wie es auch erwartet wird.

Ich bin mir nicht sicher, ob ich damit sogar auf dem richtigen Weg bin.

Dank

+0

Sie diesen Artikel SO finden könnte nützlich: http://stackoverflow.com/questions/33968655/how-can-i-use-my-json-without-triggering-a- Neu-API-Anfrage-Everytime-ich-will-zu-u/33969521 # 33969521 – sjokkogutten

Antwort

2

Sie sind ein Versprechen der Rückkehr so ​​müssen Sie immer ein Versprechen zurück, auch auf die Antwort im Cache gespeichert, können Sie es relativ einfach, auf dieser Ebene durch Umwickeln sie in einem $ Frage: Wann (https://docs.angularjs.org/api/ng/service/ $ tun können q) die ein Versprechen zurückgeben sofort gelöst wird.

Obwohl $ http-Dienst Caching eingebaut hat, sollten Sie sich den Cache-Abschnitt ansehen.

https://docs.angularjs.org/api/ng/service/ $ http

https://www.ng-book.com/p/Caching/

1

Dies sollte funktionieren: Insteada Zuordnung obj = [] als null zuordnen. Normalerweise bevorzuge ich Rückruf. Sie können diesen Code versuchen:

.factory('$factory', function($q, $http, $timeout, $state, $ionicHistory, $localstorage) { 
var obj = []; 

var functions = { 
    getData: function(cb) { 
     // instead of checking !obj you have to check for length or you have to set obj as null 
     if (obj && obj.length == 0) { 
      $http({ 
       url: remoteUrl + '/getdata', 
       method: 'POST', 
       data: {} 
      }).then(function(response) { 
        obj = response.data; 
        cb(response.data) 
       }, function(response) { 

       } 
      } 
      else { 
       cb(obj) 
      } 
     } 
    } 
    } 
}) 
// You can use callback by following code 

    $factory.getData(function(response){ 
    // response will come here 
    }) 
Verwandte Themen