Задать вопрос

Как повторить неудачно выполненный javascript promise?

Пытаюсь работать с промисами на примере где надо резолвить 10-15 физических адресов в координаты с помощью Google Maps Geocoding API который иногда возвращает ошибку OVER_QUERY_LIMIT , которая пропадает через пару секунд ожидания. Хочу при получении этой ошибки подождать 1 секунду и выполнить текущий промис еще раз.

var geocoder = new google.maps.Geocoder();

var proms = businesses.map(function(address) {
    return prom = new Promise(function(resolve) {
       geocoder.geocode({
            address: address
        }, function(results, status) {

            if (status === google.maps.GeocoderStatus.OK) {
                resolve({
                    results: results,
                    business: address
                });

            } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function() {
                    //КАК ЗАПУСТИТЬ ТЕКУЩИЙ "new Promise" ЕЩЕ РАЗ?
                }, 1000);

            } else {
                console.log(status + ': ' + results);
            }

        });
    });
});

Promise.all(proms);


В else if ловится ошибка и устаналивается таймер на секунду, что вызывать в этом таймере?

Спасибо!
  • Вопрос задан
  • 2672 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
что вызывать в этом таймере?


resolve или reject в зависимости от результата. Можно сделать так:

function getAddressLocation (address, repeat) {
    repeat = repeat !== false;
    
    return new Promise(function(resolve, reject) {
        geocoder.geocode({
            address: address
        }, function(results, status) {

            if (status === google.maps.GeocoderStatus.OK) {
                resolve({
                    results: results,
                    business: address
                });

            } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT && repeat) {
                setTimeout(function() {
                    getLocationAddress(address, false).then(resolve, reject);
                }, 1000);

            } else {
                reject(status)
            }
        });
    })
}


Но лучше изначально сделать какую-то очередь, и выполнять не сразу по требованию а в порядке очереди + вроде как вам в заголовках должны предоставлять информацию о количестве запросов которое вам позволено делать. Ну это так, для оптимизации всего этого добра. Ида - промисы можно чейнить, можно выстраивать цепочки. вклиниваться туда и т.д.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы