Google Maps Directions Service, как ждать всех запросов на fini sh? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть список техников, которые мне нужны, чтобы получить индивидуальное время в пути между определенным местом. Я использовал скрипт для этого в Google Sheets, но вместо этого я бы предпочел вычисления внутри моего веб-приложения. Здесь, конечно, есть несколько вопросов. Во-первых, я не могу просто сделать эти запросы в течение 1 oop без какой-либо задержки, иначе я получу ошибку over_query_limit. Другая проблема заключается в том, что я хочу, чтобы пользователь знал, что все запросы выполнены, и на этом я застрял. В настоящее время я использую пакет google-maps-react npm для выполнения sh этого.

Вот что у меня сейчас есть:

TechDriveTimeTest(techs, kioskInfo){
        let result = []
        techs.forEach(tech => {
            if(tech.Address != "" && !tech.Notes.includes('Not')){
                result.push(tech);
            }
        })

        //console.log(result);

        let directionsService = new google.maps.DirectionsService();

        result.forEach((tech, index) => {
            let techAddress = tech.Address + " " + tech.City + " " + tech.State + " " + tech.Zip

            let req = {
                origin: techAddress,
                destination: 'some destination',
                travelMode: 'DRIVING'
            }

            this.GetTime(index, req, directionsService);

        })
    }

    GetTime(i, req, service){
        setTimeout(function(){
            service.route(req, function(res, status){
                if(status == 'OK'){
                   let time = res.routes[0].legs[0].duration.text
                   console.log(time);
                }
            })
        }, (i+1) * 1000)
    }

Этот код отлично работает с задержкой запросов так что я больше не получаю сообщение об ошибке, но было бы неплохо знать, когда все запросы завершены, чтобы я мог уведомить пользователя. Спасибо!

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете использовать рекурсию для запуска запросов по одному, вот пример:

function TechDriveTimeTest(techs, kioskInfo){
    techs = techs.filter(tech => tech.Address != "" && !tech.Notes.includes('Not'))
                 .map(tech => `${tech.Address} ${tech.City} ${tech.State} ${tech.Zip}`);

    const directionsService = new google.maps.DirectionsService();
    recursion();
    function recursion() {
        const techAddress = techs.shift();
        directionsService.route({
            origin: techAddress,
            destination: 'some destination',
            travelMode: 'DRIVING'
        }, function(res, status){
            if(status == 'OK'){
               let time = res.routes[0].legs[0].duration.text
               console.log(time);
            }
            if (techs.length) {
                setTimeout(recursion, 1000);
            } else {
                console.log('DONE');
            }
        });
    }
}

Здесь recursion удаляет первый элемент из массива techs и затем, когда приходит ответ о направлениях, если в массиве techs все еще есть элементы, функция recursion вызывается снова.

...