2016-10-28 2 views
0

Я создал рекурсивный вызов функции в AngularJS и просто интересно, есть ли лучший способ решить эту проблему?

Мой код выглядит следующим образом:

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

Вы бы не просто поместить 'отложила. разрешить' звонок ** внутри ** таймаут? – adeneo

+0

Уже пробовал это раньше, но не решил мою проблему и не стал ждать. – Embrioka

+0

Задержка в миллисекундах. вы увеличиваете порядок на 100 мс, попробуйте использовать его в секундах (умножение 1000). [Обратитесь к документам] (https://docs.angularjs.org/api/ng/service/$timeout) – Mahesh

ответ

0

при вызове deferred.resolve($timeout(function() { ..., вы говорите, что ваша функция обещания успешно решена, и вы вернетесь $ тайма-аута (который по своей самости обещания) объект обещания, вместо ожидаемого {lang:..., lat:...} объект. Это звучит неправильно. Затем вы начинаете новый вызов функции обещания в пределах $timeout.

Я бы попытаться вернуть $ таймаута обещание, а не его разрешения, и вызвать функцию getLocation(...) в $timeout.then(), также я хотел бы вернуться deferred.resolve(object) вместо исполнения:

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, Как я уже упоминал ранее, эта функция работает отлично. Ваше решение неверно, потому что вы не решите свое обещание в случае OVER_QUERY_LIMIT! Проблема для меня в том, что это решение немного уродливое для моих глаз :) – Embrioka

Смежные вопросы