2017-09-15 4 views
2

Ich habe ein Artikel-Array, das ich von localStorage erhalten würde.Erstellen eines Versprechens bedingt in AngularJS

    var items = JSON.parse($window.localStorage.selectedResources)['server']; 

        var arr = []; 

        var idsArray = []; 

        angular.forEach(items, function (item) { 
         idsArray.push(item.id); 
        }); 

Dann feuern ich einen Anruf API ...

    //Make the API call 
        ds.getBillInfo(idsArray) 
         .then(function(response){ 
          var serversList = []; 
          for (var key in response) { 
           // iterate over response 

Das Problem ist, wenn die Elemente Array leer ist, so die idsArray tut. Dann sagt der Fehler Cannot read property 'then' of undefined.

Was ich tun möchte, ist even if the idsArray is empty , I want lines to execute inside the then block thinking as there is no promise.

Wie kann ich das tun?

EDIT

Wenn ich $q.all([ds.getBillInfo(idsArray)]) tun, dann gibt es keinen Fehler.

Die getBillInfo() wie folgt aussieht:

 this.getBillInfo = function(idsArray){ 
      if(!idsArray.length) return; 
      var segmentUrl = ''; 
      for(var i =0;i<idsArray.length;i++){ 
       if(i != (idsArray.length-1)) 
        segmentUrl += 'ids='+idsArray[i]+'&'; 
       else 
        segmentUrl += 'ids='+idsArray[i]; 
      } 
      return HttpWrapper.send('/api/bill?bill=t&'+segmentUrl, {"operation": 'GET'}); 
     }; 
+1

Sie müssen fix 'getBillInfo' immer ein Versprechen – SLaks

+0

Etwas Rückkehr ist nicht hier ... Wie @SLaks sagte. – Pytth

+0

... sogar etwas wie 'Promise.reject ('empty')' würde funktionieren, und Sie würden in den Haken kommen, oder 'Promise.resolve()', um – adeneo

Antwort

2

In getBillInfo Ihre Logik mit neuen Versprechen wickeln und auf leeres Array es lösen.

Etwas wie:

self.getBillInfo = function(array){ 

    var deferred = $q.defer(); 

    if(array.length == 0){ 
    deferred.resolve([]); // return empty list 
    } 
    else{ 
    var segmentUrl = ''; 
    for(var i =0;i<idsArray.length;i++){ 
     if(i != (idsArray.length-1)) 
      segmentUrl += 'ids='+idsArray[i]+'&'; 
     else 
      segmentUrl += 'ids='+idsArray[i]; 
     } 
     HttpWrapper.send('/api/bill?bill=t&'+segmentUrl, {"operation": 'GET'}) 
     .then(function (response) { 
       deferred.resolve(response.data); 
     } 
     , function (error) { 
       deferred.reject(error); 
     }); 

    } 

    return deferred.promise; 
} 

[EDIT]

Grüße an @JC Ford Punkt, da HttpWrapper Renditen versprechen wir über Logik mit unterschiedlicher Art und Weise, wie schreiben:

self.getBillInfo = function(array){ 

    if(array.length == 0){ 
    return $q.resolve([]); // return empty list; 
    } 
    else{ 
    var segmentUrl = ''; 
    for(var i =0;i<idsArray.length;i++){ 
     if(i != (idsArray.length-1)) 
      segmentUrl += 'ids='+idsArray[i]+'&'; 
     else 
      segmentUrl += 'ids='+idsArray[i]; 
     } 
     return HttpWrapper.send('/api/bill?bill=t&'+segmentUrl, {"operation": 'GET'});   
    } 
} 
+0

Wenn 'HttpWrapper.send' bereits ein Versprechen zurückgibt, ist dies überflüssig. Es wird funktionieren, aber die Verwendung von '$ q.defer()' ist wirklich für das Erstellen eines Versprechens, wenn Sie noch keins haben. Dies ist übermäßig kompliziert und daher keine Best Practice. –

+0

@JCFord stimme zu, aber es sieht klar aus, jedenfalls werde ich die Antwort mit deinem Weg aktualisieren;) –

+0

Verwende '$ q.resolve ([])' anstatt einen Deferred zu machen. – SLaks

1

inject der $ q Service, so dass es in getBillInfo() zugänglich ist. Sie können dann einen Wert in $q.resolve() umbrechen, um eine Zusage zu machen, die diesen Wert zurückgibt. (Dieser Wert könnte sogar ein anderes Versprechen sein.) Wenn also Ihre getBillInfo()-Funktion manchmal ohne Wert zurückkehrt, geben Sie einfach eine leere $q.resolve() zurück, um sicherzustellen, dass Sie immer ein Versprechen abgeben.

this.getBillInfo = function(idsArray){ 

    //This returns undefined and causes your error. 
    if(!idsArray.length) return; 

    //This returns a promise that resolves immediately and executes your .then() handler. 
    if(!idsArray.length) return $q.resolve(); 

    //This returns a promise that rejects immediately and executes your .catch() handler 
    if(!idsArray.length) return $q.reject(); 

    var segmentUrl = ''; 
    for(var i =0;i<idsArray.length;i++){ 
     if(i != (idsArray.length-1)) 
      segmentUrl += 'ids='+idsArray[i]+'&'; 
     else 
      segmentUrl += 'ids='+idsArray[i]; 
    } 
    return HttpWrapper.send('/api/bill?bill=t&'+segmentUrl, {"operation": 'GET'}); 
}; 
+0

Beachten Sie, wo Sie 'if (! IDsArray.length) return 'haben. Geben Sie stattdessen dort $ q.resolve() ein. –

Verwandte Themen