Для цикла не завершена - PullRequest
0 голосов
/ 15 апреля 2019

Я написал функцию, которая организует адреса на основе расстояния. Работает нормально, пока не введу 5 адресов. После этого цикл for будет выполняться только 2 раза вместо запланированных 5 раз. Что я делаю не так?

async function getNextStop() {
    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];
        const newDis = await getDistance(lastLi.querySelector('address').innerText,
          stopItems[i].querySelector('address').innerText)
          .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);
    }
  }

1 Ответ

0 голосов
/ 15 апреля 2019

Примечание: я не экстрасенс - я нашел функцию 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, есть попытка / отлов для обработки любых ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...