Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google Street View JS APIv3在街道数据发现零结果时重试请求_Javascript_Google Maps_Oop_Google Maps Api 3_Google Street View - Fatal编程技术网

Javascript Google Street View JS APIv3在街道数据发现零结果时重试请求

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

当我在最大半径为50米的范围内获得标记的全景图时,有时它找不到全景图,但如果我将半径设置为60米以上,它就会工作

所以我想自动对半径为+10米的街道数据发出另一个请求,如果在总共100米的范围内没有发现任何东西,那么就完全停止

我知道如何在过程JS中使用for或while循环,但我不知道OOP JS,所以我不确定在哪里/如何根据函数响应再次触发请求

基本上代码看起来像

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");
        }
    });
}

这对我来说有点高技术没有设置时间超时是如何工作的?@RomanToasov
setTimeout
创建一个
timeout
对象,在延迟(也作为参数传递)后执行函数(作为参数传递),从调用函数时开始。基本上,它会在做某事之前等待一段时间。这不会意外地导致您在一秒钟内触发太多查询,这将对您的程序有害。这是非常标准的JS。这是一个很好的学习机会。我明白你现在的观点了,你在响应中添加了超时功能,以等待循环中的下一次执行,这样谷歌就不会阻止脚本进行快速重试。这实际上让我一开始觉得我必须使用timeout,因为OOP的细节…@bcdan你确定有查询限制吗?如果是,你知道是什么吗?我只是在没有等待的情况下重复了这个查询,到目前为止它仍然有效。@Keith我不知道这个查询限制在我的头顶上,但我知道它们是否准确启动是不稳定的。基本上,每秒5次的配额限制或其他任何限制都有可能不会立即发生,查询将继续进行。延迟是一种健壮的编程,它可以防止程序出错,以防Google的查询限制恰好正常工作。这对我来说有点高技术没有设置时间超时是如何工作的?@RomanToasov
setTimeout
创建一个
timeout
对象,在延迟后执行函数(作为参数传递)(也作为参数传递),在调用函数时开始。基本上,它会等待一段时间后再执行操作。这不会意外地导致您在一秒钟内触发太多查询,这对您的程序有害。这是非常标准的JS。这是一个很好的学习机会。我明白您现在的观点,您添加了超时功能以响应等待直到循环中的下一次执行,这样google就不会阻止脚本进行快速重试。这实际上让我一开始觉得我必须使用超时,因为OOP的细节…@bcdan你确定有查询限制吗?如果是的话,你知道它是什么吗?我只是在不等待的情况下重复了查询,到目前为止它仍然有效。@Keith我不知道查询限制是关闭的他在我的头上,但我确实知道,他们是否准确地踢进来是不稳定的。基本上,每秒5次的配额限制或其他任何限制都有可能不会立即发生,并且查询会继续。延迟是一种强大的编程,它可以防止程序出错,以防谷歌的查询限制恰好正常工作。小心请注意,如果侦听器快速连续激活,且标记远离可用图像,则请求收集的速度可能比解析的速度快。请注意,如果侦听器快速连续激活,且标记远离可用图像,则请求收集的速度可能比解析的速度快。