2016-10-28 5 views
0

Ich habe einen rekursiven Funktionsaufruf in AngularJS erstellt und frage mich nur, gibt es eine bessere Möglichkeit, dieses Problem zu lösen?

Mein Code ist folgende:

function getLocation(query, map, object, delay) { 
    var deferred = $q.defer(); 
    var service = new google.maps.places.PlacesService(map); 
    service.textSearch({ query: query }, function (results, status) { 
     if (status == google.maps.places.PlacesServiceStatus.OK) { 
      var loc = results[0].geometry.location; 
      object.lang = loc.lng(); 
      object.lat = loc.lat(); 
      deferred.resolve(object); 
     } else { 
      if (status === "OVER_QUERY_LIMIT") { 
       delay += 100; 
       deferred.resolve($timeout(function() { 
        var deferred = $q.defer(); 
        getLocation(query, map, object, delay).then(function (object) { 
         deferred.resolve(object); 
        }); 
        return deferred.promise; 
       }, delay)); 
      } else { 
       deferred.reject(status); 
      } 
     } 
    }); 
    return deferred.promise; 
} 
+0

Würden Sie nicht nur Platz, die 'verschoben. Auflösen des Anrufs ** innerhalb ** der Zeitüberschreitung? – adeneo

+0

Habe es schon mal versucht, aber mein Problem nicht gelöst und nicht gewartet. – Embrioka

+0

Verzögerung ist in Millisekunden. Sie werden in der Reihenfolge von 100 ms inkrementiert, versuchen Sie es in Sekunden zu verwenden (multiplizieren Sie 1000). [Siehe die Dokumente] (https://docs.angularjs.org/api/ng/service/$timeout) – Mahesh

Antwort

0

wenn Sie deferred.resolve($timeout(function() { ... anrufen, sagen Sie, dass Ihr Versprechen Funktion erfolgreich gelöst wird, und Sie kehren $ timeout Versprechen Objekt (das durch seine Selbst ein Versprechen ist), statt von erwarteten {lang:..., lat:...} Objekt. Es klingt nicht korrekt. Dann starten Sie einen neuen Anruf, um die Funktion innerhalb $timeout zu versprechen.

Ich würde versuchen, $ timeout Versprechen zurückzukehren, anstatt es zu lösen, und getLocation(...) Funktion aufrufen innerhalb $timeout.then(), würde ich auch deferred.resolve(object) statt Ausführung zurück:

function getLocation(query, map, object, delay) { 
    var deferred = $q.defer(); 
    var service = new google.maps.places.PlacesService(map); 
    service.textSearch({ query: query }, function (results, status) { 
    if (status == google.maps.places.PlacesServiceStatus.OK) { 
     var loc = results[0].geometry.location; 
     object.lang = loc.lng(); 
     object.lat = loc.lat(); 
     return deferred.resolve(object); 
    } else if (status === "OVER_QUERY_LIMIT") { 
     delay += 100; 
     return $timeout(function() {}, delay).then(function() { 
     return getLocation(query, map, object, delay); 
     }); 
    } else { 
     deferred.reject(status); 
    } 
    }); 
    return deferred.promise; 
} 
+0

Hey Andriy, Wie bereits erwähnt, funktioniert diese Funktion einwandfrei. Ihre Lösung ist nicht korrekt, weil Sie Ihr Versprechen im Falle von OVER_QUERY_LIMIT nicht lösen werden! Das Problem für mich ist diese Lösung ist ein bisschen hässlich für meine Augen :) – Embrioka

Verwandte Themen