-1

我写了一个函数,它将根据距离组织地址。在我输入 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);
    }
  }
4

1 回答 1

0

注意:我不是通灵者-我getDistance在 OP 的网站上找到了该功能,他在聊天中链接到该功能:p

但我对速率限制很敏感:p

首先......处理错误getDistance- 否则承诺将永远悬而未决 - 所以,永远await编辑

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但是,如果代码调用有一个 try/catch 来处理任何错误,那应该是不必要的

于 2019-04-15T01:08:51.263 回答