5

Ich arbeite an einer angularJS App und das ist meine erste Website mit diesem Framework. In meiner App muss ich einen $ http-Aufruf innerhalb einer for-Schleife machen. Mit in der Schleife vor der nächsten Iteration möchte ich auf die Antwort von meinem vorherigen Anruf warten. Was ist der beste und einfachste Weg dies zu tun? Ich habe versucht, mit dem CallBack, $ q.all(), dann in all diesen nur die letzte Anfrage durchläuft. Bitte helfen Sie.

Hinweis: Meine API, die über $ http aufruft, kann keine Anforderungen in die Warteschlange stellen.

Edit: ich beide die folgenden Ansätze versucht haben, in beiden Fällen nur die letzte Anforderung erfolgreich durchgeführt wird. Kannst du mir sagen, was ich hier falsch mache?

Ansatz 1:

var promiseArray=[]; 

for(var i=0;i<items.length;i++) 
{ 
var promise=services.Post(items[i]); 
promiseArray.push(promise); 
} 

$q.all(promiseArray).then(data) 
{ 
... 
} 

Ansatz 2:

var promises = []; 

for (var i = 0; i < items.length; i++) { 

    var deffered = $q.defer(); 
    var promise = services.Post(items[i]); 
    promise.success(function(data) { 
     deffered.resolve(data); 
    }) 
    promises.push(deffered); 
} 

var result = $ q.all (Versprechen);

EDIT: 2 Servicecode:

Services.Post = function(lineItemId, submitUrl) { 
    var url = (submitUrl) ? submitUrl : Services.serviceUrl; 

    return $http.post(url, { 
     "LineItemID": lineItemId 
    }). 
    success(function(data, status, headers, config) { 
     Services.processResponse(data, status, headers, config); 
    }). 
    error(function(data, status, headers, config) { 

     JL('Angular').error('Error response when calling Service ' + config); 

    }); 
}; 
+0

werfen Sie einen Blick auf die Asynchron-lib (https://github.com/caolan/async) Sie es auf dem Browser laden konnte über browserify/webpack/jspm –

Antwort

5

könnten Sie $q.when verwenden, die Versprechen von $http & nehmen würde, wenn sie es nennen die Funktion innerhalb .then

$q.when(promiseObj).then(callback); 

aufgelöst wird Wenn es sind mehrere Versprechen, dann könnten Sie $q.all verwenden, die Array von Versprechenakzeptieren würdeaufgerufen dann Funktion, wenn alle Versprechen innerhalb der Funktion gelöst wird.

$q.all([promiseObj1, promiseObj2]).then(callback); 

aktualisieren

Ich denke, Sie ist der 1. Ansatz richtig nur paar Teile fehlen sollte

  1. for Schleifenbedingung, die ein zusätzliches Objekt schafft, die
  2. $q.all nicht definiert werden, sollte die Funktion innerhalb haben .then

-Code

var promiseArray=[]; 

for(var i=0; i < items.length - 1;i++) //<-- change from i<items.length 
{ 
var promise=services.Post(items[i]); 
promiseArray.push(promise); 
} 

$q.all(promiseArray).then(function(data) //<-- it should be function in .then 
{ 
    //this will called after all promises get resolved. 
}); 
+0

Hallo Pankaj, Danke für die Antwort, ich habe verschiedene Ansätze ausprobiert, die ich oben erwähnt habe. Bitte sieh es dir an und korrigiere mich, wenn etwas nicht stimmt. –

+0

@AjaySrikanth Ihr erster Ansatz sieht cool zu..Ich denke, in eckigen Service haben Sie nicht ein Versprechen, Sie sollten Versprechen vom Dienst zurückgeben..wenn Sie irgendwelche Zweifel haben dann ... fügen Sie eckigen Service-Code zu ..Ich werde mit diesem Code auch helfen –

+0

Danke für die Erweiterung Ihrer Hilfe, ich habe meinen Service-Code hier kopiert, können Sie bitte einen Blick darauf werfen –