0

Ich arbeite an meinem angularjs Projekt. Ich habe diesen Service:Http Service Verzögerung Verarbeitung bis nach Daten zurückgegeben wird

(function() { 
    "use strict"; 

    angular.module("manageItems").factory("manageItemsService", ["$http", "config", manageItemsService]); 

    function manageItemsService($http, config) { 
     var service = { 
      getNewItems: getNewItems, 
     }; 
     return service; 

     function getNewItems(session, mapName) { 
      return $http.get(serviceUrl + 'getNewItems/' + session + "/" + mapName); 
     } 

    } 
})(); 

Und hier, wie ich den Service von Controller nennen:

function getNewItems() { 
    manageItemsService.getNewItems(mapguideService.mapName, mapguideService.sessionId).then(function (result) { 
     self.currentItems = result.data; 
    }) 
} 

Ich muss Service machen zu verzögern, während die Reaktion zurückgeführt.

Wie kann ich die Servicefunktion ändern, damit sie wartet, bis die Eigenschaft self.currentItems mit Daten gefüllt ist?

+1

Es ist das erwartete Verhalten, obwohl das, was die Frage ist ?? –

+0

@PankajParkar siehe Update – Michael

+0

kann ich wissen, was genaues Szenario ist? –

Antwort

0

Dann könnten Sie .then auf getNewItems $ http Anruf gestellt werden. Ermitteln Sie basierend auf abgerufenen Antwortdaten, ob Daten zurückgegeben oder eine andere Servicemethode aufgerufen werden sollen.

+0

Danke für den Post.Was ist, wenn ich 3 Anrufe machen muss? Ich meine, wenn der erste leer ist, mach den zweiten, wenn seci = ond leer ist, mach dritten.Ich denke nicht, dass es eine gute Praxis ist – Michael

+2

So handle ich, wenn ich will Prozess Zwischenschritt vor Service-Antwort .. Verwenden & verlängern Versprechen Verkettung ist eine gute Möglichkeit, mit einem solchen Szenario umzugehen. Ich denke nicht, so seine schlechte Praxis (lassen Sie mich wissen, wenn Sie einen Verweis finden, wo seine Staaten erwähnt ist schlechte Praxis), Danke;) –

1

Zuerst muss ich sagen, dass HTTP-Anfragen tatsächlich asynchron ausgeführt werden, um die Anwendung nicht zu stoppen, während das Ergebnis zurückgegeben wird.

So haben Sie zwei Möglichkeiten, verwenden Sie das Winkelmuster, um Ihre Methode anzupassen, um das Ergebnis zu behandeln, so müssen Sie eine Rückruffunktion an den Dienst übergeben, so dass der Dienst, nicht der Controller die Zuordnung vornehmen. Es wäre so etwas wie:

Service:

(function() { 
     "use strict"; 

     angular.module("manageItems").factory("manageItemsService", ["$http", "config", manageItemsService]); 

     function manageItemsService($http, config) { 
      var service = { 
       getNewItems: getNewItems, 
      }; 
      return service; 

      function getNewItems(session, mapName, callback, errorCallback) { 
       $http.get(serviceUrl + 'getNewItems/' + session + "/" + mapName).then(callback, errorCallback);; 
      } 

     } 
    })(); 

Controller:

function getNewItems() { 
    manageItemsService.getNewItems(mapguideService.mapName, mapguideService.sessionId, function (result) { 
     //this callback will be called asynchronously when the response is available 
     self.currentItems = result.data; 
    }, function(error) { 
     // called asynchronously if an error occurs 
     // or server returns response with an error status. 
    }) 
} 

Die zweite Option ist absolut nicht zu empfehlen, eine Schleife eingefügt, während das Ergebnis erwartet wird ... (zu schlecht)

Ich hoffe ich habe geholfen!

+1

Siehe [Warum Callbacks von Versprechen '.then 'Methoden ein Anti-Pattern] (http : //stackoverflow.com/questions/35660881/why-are-callbacks-from- promise-then-methods-an-anti-pattern). – georgeawg

0

Was der Code tun muss, ist Kette verspricht.

Um die getNewItems Funktion verkettbar zu machen, Rückkehr die abgeleitete Versprechen:

function getNewItems() { 
    //vvvv RETURN promise 
    return manageItemsService.getNewItems(mapguideService.mapName, mapguideService.sessionId) 
     .then(function (response) { 
     self.currentItems = response.data; 
     //RETURN value to chain 
     return response.data; 
    }); 
}; 

das zurückgegebene Versprechen Kette mehr Operationen verwenden Dann:

getNewItems().then(function(currentItems) { 
    //Evaluate current Items 
    if (ok) { 
     return "DONE"; 
    } else { 
     //RETURN to chain something else 
     return getOtherItems(); 
    }; 
}).then(function(otherItems) { 
    if (otherItems == "DONE") return; 
    //ELSE 
    self.otherItems = otherItems; 
    //Do further chaining 
}); 

Da die .then Aufruf Methode eines Versprechens gibt ein neues abgeleitetes Versprechen zurück, es ist leicht möglich zu erstellen eine Kette von Versprechen.

Es ist möglich, Ketten beliebiger Länge und zu erstellen, da ein Versprechen mit einem anderen Versprechen gelöst werden kann (was seine Auflösung weiter verzögern wird), ist es möglich, die Auflösung der Versprechen zu jedem Zeitpunkt in der Pause anzuhalten Kette. Dies ermöglicht die Implementierung leistungsfähiger APIs.

— AngularJS $q Service API Reference - Chaining Promises

Verwandte Themen