Примечание: я не экстрасенс - я нашел функцию getDistance
на сайте ОП, на которую он ссылался в чате: p
Но я экстрасенс по поводу ограничения скорости: p
Сначала ... обработайте ошибки в getDistance
- иначе обещание будет навсегда ожидающим - так, навсегда await
ed
function getDistance(thing1, thing2) {
return new Promise((resolve) => {
const request = {
origin: thing1,
destination: thing2,
travelMode: 'DRIVING',
};
directionsService.route(request, (result, status) => {
if (status === 'OK') {
resolve(Number(result.routes[0].legs[0].distance.text.replace(/[^\d.-]/g, '')));
} else {
reject({result, status});
}
});
});
}
Второй - если вы определили, что вы ограничены 10 запросами в секунду, тогда ограничьте свою скорость
async function getNextStop() {
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const lis = document.querySelectorAll('.stop');
const stops = Array.prototype.slice.call(lis);
const stopItems = Array.prototype.slice.call(lis);
lis.forEach((i) => {
i.remove();
});
for (let stopsIndex = 0; stopsIndex < stops.length; stopsIndex++) {
const distances = [];
for (let i = 0; i < stopItems.length; i++) {
let lastLi = document.querySelectorAll('li');
lastLi = lastLi[lastLi.length - 1];
await delay(100); // 10 per second
const newDis = await getDistance(lastLi.querySelector('address').innerText, stopItems[i].querySelector('address').innerText);
// remove the next line, it is redundant
//.then(response => response);
distances.push(newDis);
}
const lowest = distances.indexOf(Math.min(...distances));
ul.appendChild(stopItems[lowest]);
stopItems.splice(lowest, 1);
console.log(stopsIndex, stops.length, stops, stopItems);
}
}
Кроме того, вы можете обрабатывать ошибки в getNextStop
try {
const newDis = await getDistance(lastLiAddress, stopItem.querySelector('address').innerText);
distances.push(newDis);
} catch(e) {
console.error('getDistance failed');
console.error(e);
throw e;
}
Однако в этом нет необходимости, если в коде, вызывающем getNextStop
, есть попытка / отлов для обработки любых ошибок