2016-07-14 17 views
1

Lassen Sie mich die Frage klären:

Ich habe eine Funktion in meiner Steuerung, die einen Service verwendet, um eine HTTP-GET-Anfrage zu senden, um zu sehen, ob der Status "erledigt" ist. Diese Funktion wird alle 5 Sekunden ausgeführt. Dies würde jedoch auch alle 5 Sekunden ausgeführt werden, selbst wenn noch keine Antwort vorliegt, ohne die vorherige Anforderung zu löschen.

Wie kann ich sicherstellen, dass innerhalb von 5 Sekunden keine Antwort erfolgt, wenn die vorherige Anforderung beendet wird? Oder gibt es dafür eine bessere Lösung?

Hier ist mein $ Intervallfunktion:

self.$interval(function setInterval() { 
    EngineService.getEngines().then(
     function getEngines(response) { 
     self.enginesListFromDatabase = response; 
     for (const item of self.enginesListFromDatabase) { 
      if (item.status === 'done' && self.doneArray.indexOf(item.id) === -1) { 
      self.doneArray.push(item.id); 
      } 
     } 
     } 
    ); 
    }, self.interval); 

Der Dienst hat diese http Aufruf:

getEngines() { 
    return this.$http({ 
     method: 'GET', 
     url: '/api/engines', 
    }).then(
     function getResponse(res){ 
      return res.data; 
     } 
     ); 
    } 

Ich habe versucht, in die Dokumente suchen, konnte aber keinen Sinn machen, wie $ Intervall zu verwenden richtig für diesen Fall oder $ q.

+3

Ich will nicht der gesamte Prozess $ Intervalls obwohl zu stoppen, ich möchte nur die vorherige Anforderung zu ‚sterben‘ oder etwas, wenn es keine Antwort gibt in sich selbst. Zeitintervall. Damit kommt die Antwort auf die zweite Anfrage nie vor der Antwort auf die erste Anfrage zurück. – McFiddlyWiddly

+1

Warum interessiert es Sie, ob die vorherige Anfrage abgebrochen wurde oder nicht? Du bekommst immer noch deine Antwort. –

+2

Weil, wenn ich um 11 Uhr Anfrage # 1 sende, und der Server gibt mir "Not done", aber sendet die Antwort nicht in 5 Minuten zurück. Wenn ich um 11: 10 Uhr Anfrage Nr. 2 sende, antwortet der Server schnell und sagt mir "fertig". Danach kommt die Antwort auf Anfrage # 1 zurück und sagt "Nicht erledigt". Ich würde denken, dass es später "nicht gemacht" wurde, nicht umgekehrt. Sag mir, wenn ich etwas falsch verstehe. – McFiddlyWiddly

Antwort

0

In Bezug auf Ihre Annullierung der Anfrage Ansatz - Ich denke, es wäre viel einfacher, eine Variable in Ihrem Controller (oder Service) zu haben, die den Done/Rückgängig-Status hält. Auf diese Weise in jeder Funktion in dem then(..) Abschnitt können Sie fragen:

if (!self.done) { 
    ... 
} 

Und dann bekommen, falls auf, die relevant ist. Andernfalls würden die Antworten aller Anfragen fehlschlagen, wenn nichts passieren würde und nichts außer Kraft gesetzt wird.

um zukünftige Anfragen absagen -

Sie können von $interval.cancel Methode machen und Ihr Intervall abzubrechen, wenn Sie Ihre Antwort, wenn es darum.

var intervalFunc = $interval(function() { 
     ... 
     if (!self.done && gotMyWay) { 
      $interval.cancel(intervalFunc); 
     } 
    }, self.interval); 

Fiddle Demonstration der Aufhebung Mechanismus.

1

Sie können ein $ Versprechen erstellen und es in EngineService zum Abbrechen von Anfragen speichern.

EngineService.canceler = $q.defer(); // $q is a service u need to inject to EngineService. this is just example that u should assign it to the service 
getEngines() { 
    return this.$http({ 
     method: 'GET', 
     url: '/api/engines', 
     timeout:EngineService.canceler 
    }).then(
     function getResponse(res){ 
      return res.data; 
     } 
     ); 
    } 

und brechen Sie die letzte Anfrage:

self.$interval(function setInterval() { 
    EngineService.canceler.resolve(); 
    EngineService.getEngines().then(
     function getEngines(response) { 
     self.enginesListFromDatabase = response; 
     for (const item of self.enginesListFromDatabase) { 
      if (item.status === 'done' && self.doneArray.indexOf(item.id) === -1) { 
      self.doneArray.push(item.id); 
      } 
     } 
     } 
    ); 
    }, self.interval); 
+0

Wissen Sie, wie ich testen kann, ob das funktioniert? Der Server arbeitet bei jedem Versuch sehr schnell, daher kann ich nicht wirklich testen, ob das funktioniert. – McFiddlyWiddly

+2

Beherrschen Sie den Server? Vielleicht könnten Sie manuell eine Verzögerung in Ihrem serverseitigen Code hinzufügen. – MMhunter

+0

Wenn Sie den Server nicht ändern können, können Sie eine Verzögerung mithilfe eines Proxys wie [Fiddler] (http://www.telerik.com/fiddler) hinzufügen, indem Sie der Anforderung einen Haltepunkt zuweisen. – kicken