2016-04-27 6 views
2

Ich habe eine Fabrik, die unter Objekt

Rückkehr kehrt {

getCuisines: function(cuisineNames){ 
     if (typeof cuisineNames !== 'string' && typeof cuisineNames !== undefined) { 
     throw new Error('Cusine type should be a string or should not have value'); 
     } 
     cuisineNames = cuisineNames || options.term; 
     cuisineNames = cuisineNames.split(','); 


     var promises=[]; 
     cuisineNames.forEach(function(cuisine){ 
     var defered = $q.defer(); 
     options.term = cuisine + ' '+ 'food'; 
     $http.get(url,{params: options}).success(function(data){ 
      defered.resolve(data); 
      localStorageService.setDishes(cuisine,data.businesses); 
      console.log("Cuisine ="+cuisine); 

      console.log(data); 
     }); 
     promises.push(defered.promise); 
     }); 
     return $q.all(promises); 
    } 
    }; 

ich dieses Werk von einem Controller rufen

MyFactory.getCuisines('American,Indian,Italian,Mexican,Japanese,Korean').then(function(data){ 
     console.log(data); 
    }); 

Verwendung Wenn Die Anwendung wird ausgeführt. Ich bekomme alle Küchen wie Koreanisch. was der letzte Parameter bestanden hat.

UPDATE 1:

ich meinen Code unten Code aktualisiert. Entfernte $ q. pushed $ http zu verspricht Array immer noch nicht funktioniert. Gleiche Antwort. Ich überprüfte meinen Server, alle Anrufe, die zum Server gemacht werden, sind für koreanisches Essen.

return { 
    getCuisines: function(cuisineNames){ 
     if (typeof cuisineNames !== 'string' && typeof cuisineNames !== undefined) { 
     throw new Error('Cusine type should be a string or should not have value'); 
     } 

     cuisineNames = cuisineNames || options.term; 
     cuisineNames = cuisineNames.split(','); 


     var promises=[]; 
     cuisineNames.forEach(function(cuisine){ 
     options.term = cuisine + ' '+ 'food'; 
     console.log(options.term); //I see different cuisine name here 
     promises.push($http.get(url,{params: options}).success(function(data){ 
      localStorageService.setDishes(cuisine,data.businesses); 
       console.log(data); 
     })); 
     }); 
     return $q.all(promises); 
    } 
    }; 
+1

Zunächst einmal, warum verwenden Sie '$ q' Service für '$ http' serivce ?? Der HTTP-Dienst gibt standardmäßig eine Zusage zurück. Siehe diese Frage: http://stackoverflow.com/questions/36631601/angularjs-simple-then-or-q-service-in-async-requests –

+1

seien Sie vorsichtig, es kann nur 6 Ajax Anrufe gleichzeitig (Navigator Einschränkung). Sie sollten besser 1 Anruf verwenden, um alle Ergebnisse zu erhalten. –

Antwort

1

Sie erhalten nur Koreanisch, weil das letzte in der Iteration ist und die anderen Versprechen außer Kraft setzt. Sie möchten push zu den $http.get Anforderungen verspricht und nicht den Deferrer, den Sie für das Abfangen des $http Ergebnisses definieren.

0

Paar Dinge:

  1. Wie @topless erwähnt hat, würden Sie $ drücken müssen http versprechen Ihre Versprechen Array
  2. q.all $() sollte Erfolg Methode '.then' haben die Ergebnisse von Ihrem Service-Anrufe zu erfassen, überprüfen diese SO link beispielsweise
0

Hum, schwierig, ohne die Netzwerkaktivität zu sehen, aber Sie kehren nicht von der get $ http Anruf, versuchen Sie mit diesem Synta x:

getCuisines: function(cuisineNames){ 
    if (typeof cuisineNames !== 'string' && typeof cuisineNames !== undefined) { 
     throw new Error('Cusine type should be a string or should not have value'); 
    } 

    cuisineNames = cuisineNames || options.term; 
    cuisineNames = cuisineNames.split(','); 

    var promises = cuisineNames.map(function(cuisine) { 
     options.term = cuisine + ' '+ 'food'; 
     console.log(options.term); 
     return $http.get(url,{params: options}) 
        .then(function(data){ 
         localStorageService.setDishes(cuisine,data.businesses); 
         console.log(data); 
         return data; 
        }); 
    }); 

    return $q.all(promises); 
} 
+0

Ich denke '.then'/'.success' hängt davon ab, welche Version von eckigen verwendet wird. Ich habe Ihre Lösung mit beiden Fällen versucht, ich bekomme die gleiche Antwort. 'console.log (options.term);' protokolliert den Namen einer anderen Küche, aber der Anruf wird nur für Koreanisch gemacht –