与StreetViewService的异步 - 使用回调失败



我写了一个JS脚本,以接收给定点(纬度,经度)的最近的街景位置。我对(在我看来)回调函数有问题。

这是代码:

<html>
  <head>
    <meta charset="utf-8">
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  </head>
  <body>
      <input type="file" id="file-input" />
      <h3>Contents of the file:</h3>
      <pre id="file-content"></pre>
    <div class="container">
      <div>gid,lat_from,lon_from</div>>
    </div>
    <script>
function readSingleFile(e) {
  var file = e.target.files[0];
  if (!file) {
    return;
  }
  var reader = new FileReader();
  reader.onload = function(e) {
    var contents = e.target.result;
    processFile(contents, returnFile)
    
  };
  reader.readAsText(file);
}
result = "";
function processFile(contents, callback) {
  var text = contents
  var splitted = text.split('rn')
  splitted.forEach(function(point) {
    var gid = point.split(';')[0]
    var latilong = point.split(';')[1].replace(/[ ]/g, '')
    var splitted2 = latilong.split(':')
    var lat = splitted2[1].split(',')[0]
    var lon = splitted2[2].split('}')[0]
    var latilong = new google.maps.LatLng(lat, lon);
    // alert(latilong)
    var radius = 20
    var streetViewService = new google.maps.StreetViewService();
    streetViewService.getPanoramaByLocation(latilong, radius, function(data, status)
      {
        if (status == google.maps.StreetViewStatus.OK)
        {
          var nearStreetViewLocation = data.location.latLng;
         
          result = result + gid + ', ' + JSON.stringify(nearStreetViewLocation).replace(/[" } { lat long :]/g,'') + '</br>';
          $( ".container" ).append(result);
          $( ".container" ).append('<br/>');
        }
        else {
          $( ".container" ).append("<div> "+ gid + ', 0' + "</div>" );      
        }
          
        });
    });
  if (callback) {
      callback(result);
  }
}
function returnFile(results) {
  if(results) {
  	$( ".container" ).append('<br/> from callback function: </br>');
  	$( ".container" ).append(results);
  } else {
  	alert('results is null');
  }
}
document.getElementById('file-input')
  .addEventListener('change', readSingleFile, false);
      
       </script>
  </body>
</html>

您可以以给定文本文件作为示例运行脚本:

7512 ; {lat:52.2254802729, lon:21.0105694375}
7513 ; {lat:52.2254556313, lon:21.0104179005}
7563 ; {lat:52.2245593608, lon:21.0063570311}

您可以看到结果变量 returnFile 函数为空(提醒 results 是null)。它在 processFile 函数中并不为空(" " container" )在 processFile 函数中传递给> >returnfile 函数。

如何修复?我认为这种回调足以通过 processFile 函数传递非空变量。

我想在 returnfile 函数中处理 result 变量, processFile

欢呼!

似乎我通过使用counter在foreach中解决了这一点(如上所述:毕竟是ersynchronous for for erach回调),这是代码:

<html>
  <head>
    <meta charset="utf-8">
    <title>Directly accessing Street View data</title>
    <style>
      html, body, #map-canvas {
        height: 100%;
        margin: 0px;
        padding: 0px
      }
    </style>
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  </head>
  <body>
      <input type="file" id="file-input" />
      <h3>Contents of the file:</h3>
      <pre id="file-content"></pre>
    <div class="container">
      <div>gid,lat_from,lon_from</div>>
    </div>
    <script>
function readSingleFile(e) {
  var file = e.target.files[0];
  if (!file) {
    return;
  }
  var reader = new FileReader();
  reader.onload = function(e) {
    var contents = e.target.result;
    processFile(contents, returnFile)
    
  };
  reader.readAsText(file);
}
result = "";
function processFile(contents, callback) {
  var text = contents
  var splitted = text.split('rn')
  $( ".container" ).append("splitted length: " + splitted.length + "<br>");
  var itemsProcessed = 0;
  splitted.forEach(function(point) {
    var gid = point.split(';')[0]
    var latilong = point.split(';')[1].replace(/[ ]/g, '')
    var splitted2 = latilong.split(':')
    var lat = splitted2[1].split(',')[0]
    var lon = splitted2[2].split('}')[0]
    var latilong = new google.maps.LatLng(lat, lon);
    // alert(latilong)
    var radius = 20
    var streetViewService = new google.maps.StreetViewService();
    streetViewService.getPanoramaByLocation(latilong, radius, function(data, status)
      {
        itemsProcessed++;
        if (status == google.maps.StreetViewStatus.OK)
        {
          var nearStreetViewLocation = data.location.latLng;
          // alert(nearStreetViewLocation)
          // $( ".container" ).append("<div> "+ gid + ', ' + JSON.stringify(nearStreetViewLocation).replace(/[" } { lat long :]/g,'') +"</div>" );  
          // console.log(gid + ', ' + JSON.stringify(nearStreetViewLocation).replace(/[" } { lat long :]/g,''))          
          result = result + gid + ', ' + JSON.stringify(nearStreetViewLocation).replace(/[" } { lat long :]/g,'') + '<br>';
          $( ".container" ).append(result);
          $( ".container" ).append('<br/>');
          $( ".container" ).append("items processed: " + itemsProcessed);
          if(itemsProcessed === splitted.length) {
            callback(result);
          }
        }
        else {
          $( ".container" ).append("<div> "+ gid + ', 0' + "</div>" );      
        }
          
      });
    });
  // if (callback) {
  //     callback(result);
  // }
}
function returnFile(results) {
  if(results) {
    alert('results is not null');
  	$( ".container" ).append('<br/> from callback function: </br>');
  	$( ".container" ).append(results);
  } else {
  	alert('results is null');
  }
}
document.getElementById('file-input')
  .addEventListener('change', readSingleFile, false);
      //  points5 = [{lat:52.2254802729, lng:21.0105694375},
      // {lat:52.2254556313, lng:21.0104179005},
      // {lat:52.2245593608, lng:21.0063570311},
      // {lat:52.2245355399, lng:21.0062524214},
      // {lat:52.2245125335, lng:21.0061437961}];
      
      // // points5.forEach(function(point) {
      // //   $( ".container" ).append("<div>"+ JSON.stringify(point, null).replace(/"/g,'') +"</div>" );
      // // });
      // var radius = 20
      // var streetViewService = new google.maps.StreetViewService();
      // points5.forEach(function(point) {
      //   streetViewService.getPanoramaByLocation(point, radius, function(data, status)
      //   {
      //       if (status == google.maps.StreetViewStatus.OK)
      //       {
      //         var nearStreetViewLocation = data.location.latLng;
      //         alert(nearStreetViewLocation)
      //         $( ".container" ).append("<div>"+ JSON.stringify(nearStreetViewLocation).replace(/[" } { lat long :]/g,'') +"</div>" );            
      //         return nearStreetViewLocation
      //       }
      //       else {
      //         alert("error")
      //       }
      //   });
      // });
      
      
       </script>
  </body>
</html>

最新更新