Javascript Google Street View JS APIv3在街道数据发现零结果时重试请求
当我在最大半径为50米的范围内获得标记的全景图时,有时它找不到全景图,但如果我将半径设置为60米以上,它就会工作 所以我想自动对半径为+10米的街道数据发出另一个请求,如果在总共100米的范围内没有发现任何东西,那么就完全停止 我知道如何在过程JS中使用for或while循环,但我不知道OOP JS,所以我不确定在哪里/如何根据函数响应再次触发请求 基本上代码看起来像Javascript Google Street View JS APIv3在街道数据发现零结果时重试请求,javascript,google-maps,oop,google-maps-api-3,google-street-view,Javascript,Google Maps,Oop,Google Maps Api 3,Google Street View,当我在最大半径为50米的范围内获得标记的全景图时,有时它找不到全景图,但如果我将半径设置为60米以上,它就会工作 所以我想自动对半径为+10米的街道数据发出另一个请求,如果在总共100米的范围内没有发现任何东西,那么就完全停止 我知道如何在过程JS中使用for或while循环,但我不知道OOP JS,所以我不确定在哪里/如何根据函数响应再次触发请求 基本上代码看起来像 marker1.addListener('click', function(event) { popup1.open(m
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
sv.getPanorama({location: event.latLng, radius: 50}, processSVData);
});
下面是一个完整的示例markerB在50米处有街景数据,而markerA没有。
假设程序中其他地方没有冲突,全景查询调用得太快(超过查询限制),那么一个可能的解决方案是使用带有
超时的函数来处理查询
function getPanorama(args){
setTimeout(function(){
sv.getPanorama(args, function(data, status){processSVData(data, status, args);
//need to pass args to callback to properly increment
}, query_limit_delay);
}
在过程数据中
:
function processSVData(data, status, args){
//code
} else if (status === google.maps.StreetViewStatus.ZERO_RESULTS) {
if(args.radius < 100){
args.radius += 10; //increase radius by 10 meters
getPanorama(args);
}
}
//code
}
祝你申请好运 假设程序中其他地方没有冲突,全景查询调用过快(超过查询限制),则可能的解决方案是使用带有超时的函数来处理查询
function getPanorama(args){
setTimeout(function(){
sv.getPanorama(args, function(data, status){processSVData(data, status, args);
//need to pass args to callback to properly increment
}, query_limit_delay);
}
在过程数据中
:
function processSVData(data, status, args){
//code
} else if (status === google.maps.StreetViewStatus.ZERO_RESULTS) {
if(args.radius < 100){
args.radius += 10; //increase radius by 10 meters
getPanorama(args);
}
}
//code
}
祝你申请好运 如果这个API有查询限制,我还没有达到。我实现了一个递归函数。尝试以下方法:
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
processSVData(event.latLng, 50); // first try 50 meters
});
function processSVData(loc,rad) {
sv.getPanorama({location:loc, radius:rad}, function(data,status){
if (status===google.maps.StreetViewStatus.ZERO_RESULTS) {
processSVData(loc,rad+10); // increment by 10 meters
} else if (status===google.maps.StreetViewStatus.OK) {
// Success!
panorama.setPano(data.location.pano);
panorama.setPov({
heading: 270,
pitch: 0
});
panorama.setVisible(true);
} else {
// Failure
alert(status + " cant do nothing about it bye");
}
});
}
如果这个API有查询限制,我还没有达到。我实现了一个递归函数。尝试以下方法:
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
processSVData(event.latLng, 50); // first try 50 meters
});
function processSVData(loc,rad) {
sv.getPanorama({location:loc, radius:rad}, function(data,status){
if (status===google.maps.StreetViewStatus.ZERO_RESULTS) {
processSVData(loc,rad+10); // increment by 10 meters
} else if (status===google.maps.StreetViewStatus.OK) {
// Success!
panorama.setPano(data.location.pano);
panorama.setPov({
heading: 270,
pitch: 0
});
panorama.setVisible(true);
} else {
// Failure
alert(status + " cant do nothing about it bye");
}
});
}
这对我来说有点高技术没有设置时间超时是如何工作的?@RomanToasovsetTimeout
创建一个timeout
对象,在延迟(也作为参数传递)后执行函数(作为参数传递),从调用函数时开始。基本上,它会在做某事之前等待一段时间。这不会意外地导致您在一秒钟内触发太多查询,这将对您的程序有害。这是非常标准的JS。这是一个很好的学习机会。我明白你现在的观点了,你在响应中添加了超时功能,以等待循环中的下一次执行,这样谷歌就不会阻止脚本进行快速重试。这实际上让我一开始觉得我必须使用timeout,因为OOP的细节…@bcdan你确定有查询限制吗?如果是,你知道是什么吗?我只是在没有等待的情况下重复了这个查询,到目前为止它仍然有效。@Keith我不知道这个查询限制在我的头顶上,但我知道它们是否准确启动是不稳定的。基本上,每秒5次的配额限制或其他任何限制都有可能不会立即发生,查询将继续进行。延迟是一种健壮的编程,它可以防止程序出错,以防Google的查询限制恰好正常工作。这对我来说有点高技术没有设置时间超时是如何工作的?@RomanToasovsetTimeout
创建一个timeout
对象,在延迟后执行函数(作为参数传递)(也作为参数传递),在调用函数时开始。基本上,它会等待一段时间后再执行操作。这不会意外地导致您在一秒钟内触发太多查询,这对您的程序有害。这是非常标准的JS。这是一个很好的学习机会。我明白您现在的观点,您添加了超时功能以响应等待直到循环中的下一次执行,这样google就不会阻止脚本进行快速重试。这实际上让我一开始觉得我必须使用超时,因为OOP的细节…@bcdan你确定有查询限制吗?如果是的话,你知道它是什么吗?我只是在不等待的情况下重复了查询,到目前为止它仍然有效。@Keith我不知道查询限制是关闭的他在我的头上,但我确实知道,他们是否准确地踢进来是不稳定的。基本上,每秒5次的配额限制或其他任何限制都有可能不会立即发生,并且查询会继续。延迟是一种强大的编程,它可以防止程序出错,以防谷歌的查询限制恰好正常工作。小心请注意,如果侦听器快速连续激活,且标记远离可用图像,则请求收集的速度可能比解析的速度快。请注意,如果侦听器快速连续激活,且标记远离可用图像,则请求收集的速度可能比解析的速度快。