2016-10-26 4 views
1

Ich habe 2 API-Aufrufe.Angular geschachtelt Versprechen zeigt einen Fehler

Der zweite API-Aufruf ist abhängig von der Property-ID den zweiten API-Aufruf zu machen, zurück Parkplatz zu überprüfen, ob jede dieser Eigenschaften hat.

Wenn dies der Fall ist, füge ich Details dieser Eigenschaft zu einem Objekt hinzu und schiebe das Objekt in ein Array.

Der zweite API-Aufruf ist innerhalb des ersten verschachtelt. Nachdem ich alle Eigenschaften durchlaufen habe, überprüfe ich, ob die Array-Länge mehr als 0 ist. Wenn es dann ist, kann ich die zurückgegebenen Eigenschaften auf der Seite anzeigen, sonst wird ein Fehler angezeigt.

Das Problem besteht auch, wenn Eigenschaften mit Parken zurückgegeben werden, die else-Anweisung oder Fehlerfunktion ausgeführt wird, sowie Eigenschaften auf der Seite angezeigt werden.

Gibt es eine Möglichkeit, die verschachtelten Versprechen abgeschlossen ist, bevor die Überprüfung, ob mein Array mehr als 0?

Hier ist mein Code:

$scope.viewPropertyList = function(latlong) { 
 
    $scope.locationError = false; 
 
    var latlongArray = latlog.split('::'); 
 
    var searchLat_scope = latlongArray[0]; 
 
    var searchLon_scope = latlongArray[1]; 
 

 
    if (searchLat_scope && searchLon_scope) { 
 
     var data = Property.getAllProperties({ 
 
      dest: 'property', 
 
      apikey: API_KEY, 
 
      lat: encodeURIComponent(searchLat_scope), 
 
      limit: 10, 
 
      lon: encodeURIComponent(searchLon_scope) 
 
     }).$promise.then(function(success) { 
 
      var propertyMarkers = []; 
 
      $scope.dbMarkers = 0; 
 
      for (var i = 0, l = success.property.length; i < l; i++) { 
 
       (function(i) { 
 
        Property.getProperty({ 
 
         dest: 'property', 
 
         propertyId: success.property[i].name, 
 
         apikey: API_KEY 
 
        }).$promise.then(function(propertyData) { 
 

 
         for (var j = 0, k = propertyData.services.length; j < k; j++) { 
 
          if (propertyData.services[j].name === "parking") { 
 
           var obj = { 
 
            "propertyName": success.property[i].propertyName, 
 
            "telephone": success.property[i].telephone, 
 
            "postcode": success.property[i].address.postcode, 
 
            "city": success.property[i].address.city, 
 
            "county": success.property[i].address.county, 
 
            "addressLine1": success.property[i].address.addressLine1 
 
           }; 
 
           propertyMarkers.push(obj); 
 
          } 
 

 
         } 
 

 
         if (propertyMarkers.length != 0) { 
 
          $scope.dbMarkers = propertyMarkers; 
 
          $scope.selectedLat = searchLat_scope; 
 
          $scope.selectedlog = searchLon_scope; 
 

 
         } else { 
 
          $scope.locationErr = true; 
 
          $scope.errorMsg = "No properties found"; 
 
         } 
 

 
        }); 
 

 
       })(i); 
 
      } 
 
     }, function(error) { 
 
      $scope.locationErr = true; 
 
      $scope.errorMsg = "Something went wrong, please try again"; 
 
     }); 
 
    } 
 
}

Antwort

0

zwei Dinge:

  • gibt es keinen Versuch, mehrere Versprechen in einer Schleife erzeugt zu aggregieren.
  • die if (propertyMarkers.length > 0) {...} else {...} ist zu tief verschachtelt.

Minor:

  • die innere Iteration brechen kann, sobald 'Parken' zu finden ist. Wenn es fortgesetzt wird und weitere "Parkplätze" gefunden werden, werden doppelte Marker erstellt.
$scope.viewPropertyList = function(latlong) { 
    $scope.locationError = false; 
    var latlongArray = latlog.split('::'); 
    var searchLat_scope = latlongArray[0]; 
    var searchLon_scope = latlongArray[1]; 

    if (searchLat_scope && searchLon_scope) { 
     Property.getAllProperties({ 
      dest: 'property', 
      apikey: API_KEY, 
      limit: 10, 
      lat: encodeURIComponent(searchLat_scope), 
      lon: encodeURIComponent(searchLon_scope) 
     }).$promise.then(function(success) { 
      var propertyMarkers = []; 
      $scope.dbMarkers = 0; 

      // create an array of promises by mapping the array `success.property`. 
      var promises = success.property.map(function(prop) { 
       return Property.getProperty({ 
        dest: 'property', 
        propertyId: prop.name, 
        apikey: API_KEY 
       }).$promise.then(function(propertyData) { 
        for (var j=0, k=propertyData.services.length; j<k; j++) { 
         if (propertyData.services[j].name === 'parking') { 
          propertyMarkers.push({ 
           'propertyName': prop.propertyName, 
           'telephone': prop.telephone, 
           'postcode': prop.address.postcode, 
           'city': prop.address.city, 
           'county': prop.address.county, 
           'addressLine1': prop.address.addressLine1 
          }); 
          break; // 'parking' is found - no point iterating further 
         } 
        } 
       }); 
      }); 

      /* ******** */ 
      // Aggregate `promises` 
      $q.all(promises).then(function() { 
       // This block is now un-nested from its original position, 
       // and will execute when all `promises` have resolved. 
       if (propertyMarkers.length > 0) { 
        $scope.dbMarkers = propertyMarkers; 
        $scope.selectedLat = searchLat_scope; 
        $scope.selectedlog = searchLon_scope; 
       } else { 
        $scope.locationErr = true; 
        $scope.errorMsg = 'No parking found'; 
       } 
      }); 
      /* ******** */ 

     }).catch(function(error) { 
      $scope.locationErr = true; 
      $scope.errorMsg = 'Something went wrong, please try again'; 
     }); 
    } else { 
     $scope.locationErr = true; 
     $scope.errorMsg = 'Problem with lat/lng data'; 
    } 
} 

Anmerkungen:

  • dass die äußere Iteration nun als success.property.map() codiert, die promises und vermeidet eine IIFE die Notwendigkeit zurückgibt.
  • Zusätzliche Fehlerbehandlung hinzugefügt
+1

Dies wurde behoben. Vielen Dank für Ihre Hilfe auf diesem @ Roamer-1888 – Harry

0

Wenn ich dein Problem richtig verstanden habe, wollen Sie alle Property.getProperty Versprechungen success.property gelöst werden, bevor sie in die Erfolgsfunktion gehen propertyMarkers Länge zu überprüfen.

In diesem Fall benötigen Sie $q.all, um alle Versprechen Property.getProperty für Sie aufzulösen.

In Ihrem for (var i = 0, l = success.property.length; i < l; i++) { anhängt alle Versprechen in ein Array

Property.getProperty({ 
        dest: 'property', 
        propertyId: success.property[i].name, 
        apikey: API_KEY 
       }) 

dann $q.all(arrPromises).then(function(propertyData) { verwenden Sie die folgende Kontrolle zu tun.

Noch eine erwähnenswerte Sache, versprechen Verkettung kann leicht durch $promise.then(successFn, failFn).then(successFn, failFn).then... erreicht werden. Jedes Mal, wenn Sie then() aufrufen, wird ein weiteres Versprechen erstellt, mit dem Sie zum nächsten Versprechen ketten und Wert an das nächste weitergeben können.