Google 地图路线服务,如何等待所有请求完成?
Google Maps Directions Service, How to wait for all requests to finish?
我有一份技术人员名单,我需要他们来获取特定位置之间的个别驾驶时间。我一直在使用脚本在 Google Sheets
中执行此操作,但我宁愿在我的 Web 应用程序中进行计算。这里当然有几个问题。一是我不能在没有某种延迟的情况下只在 for 循环中发出这些请求,否则我会收到 over_query_limit
错误。另一个问题是我想要一种方法让用户知道所有请求都已完成,这就是我坚持的部分。我目前正在使用 google-maps-react
npm 包来完成此任务。
这是我目前拥有的:
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)
}
此代码可以很好地延迟请求,这样我就不会再收到错误,但最好知道所有请求何时完成,以便我可以通知用户。谢谢!
您可以对 运行 请求使用递归,一次一个,这是一个示例:
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
函数被再次调用。
我有一份技术人员名单,我需要他们来获取特定位置之间的个别驾驶时间。我一直在使用脚本在 Google Sheets
中执行此操作,但我宁愿在我的 Web 应用程序中进行计算。这里当然有几个问题。一是我不能在没有某种延迟的情况下只在 for 循环中发出这些请求,否则我会收到 over_query_limit
错误。另一个问题是我想要一种方法让用户知道所有请求都已完成,这就是我坚持的部分。我目前正在使用 google-maps-react
npm 包来完成此任务。
这是我目前拥有的:
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)
}
此代码可以很好地延迟请求,这样我就不会再收到错误,但最好知道所有请求何时完成,以便我可以通知用户。谢谢!
您可以对 运行 请求使用递归,一次一个,这是一个示例:
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
函数被再次调用。