2015-04-23 23 views
5

Sto lavorando a un'app angularJS e questo è il mio primo sito Web che utilizza questo framework. Nella mia app ho bisogno di fare una chiamata $ http all'interno di un ciclo for. Con nel ciclo prima della successiva iterazione, voglio attendere la risposta della mia precedente chiamata. Qual è il modo migliore e più semplice per farlo. Ho provato a utilizzare il callBack, $ q.all(), .questo in tutte queste solo l'ultima richiesta sta attraversando. Per favore aiuto.

Nota: la mia API che sto chiamando tramite $ http non può accodare richieste.

Modifica: Ho provato entrambi gli approcci seguenti, in entrambi i casi solo l'ultima richiesta è stata eseguita correttamente. Puoi dirmi cosa c'è di sbagliato che sto facendo qui.

Approccio 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) 
{ 
... 
} 

Approccio 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 (promesse);

EDIT: 2 Codice:

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

un'occhiata al lib asincrona (https://github.com/caolan/async) è possibile caricare sul browser tramite browserify/webpack/JSPM –

risposta

5

Si potrebbe utilizzare $q.when che avrebbe preso promessa di $http & quando viene risolto è chiamare la funzione all'interno .then

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

Se c'è sono molteplici, quindi è possibile utilizzare $q.all che accetta la serie di promesse & chiama la funzione quando tutte le promesse all'interno della funzione vengono risolte.

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

Aggiornamento

Credo che il tuo primo approccio è giusto perdere unica coppia cosa

  1. for condizione del ciclo, che fa creare un oggetto in più che sarebbe undefined
  2. $q.all dovrebbe avere funzione all'interno .then

Codice

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

Hi Pankaj, grazie per la risposta, ho provato diversi approcci che ho menzionato sopra. Si prega di dare un'occhiata a me e correggermi se c'è qualcosa di sbagliato. –

+0

@AjaySrikanth il tuo primo approccio sembra interessante. Credo che in un servizio angolare non hai restituito una promessa, dovresti restituire la promessa dal servizio ... se hai qualche dubbio allora ... e anche tu hai un codice di servizio angolare.Ti aiuterò anche con quel codice –

+0

Grazie per aver esteso il tuo aiuto, ho copiato il mio codice di servizio qui, potresti darci un'occhiata –

Problemi correlati