如何确定Google Maps loadGeoJson何时完成?

时间:2014-04-14 22:34:16

标签: javascript google-maps-api-3 knockout.js typescript

我有一个用户可以存储他们的地图样式的场景。当用户使用地图导航回该页面时,它应该按照之前的方式显示地图。

用户可以更改地理位置和边框的颜色,也可以根据人口统计信息应用主题样式。

随着新的loadGeoJson的发布,我在加速我的应用程序方面取得了巨大的成功。最初我通过JS自己绘制了所有的地理位置。这导致了大约1500个地理区域的一些内存问题。这项新功能大大降低了它。我选择在服务器端生成Features对象,只是将URL传递给地图进行渲染。此URL与所有其他样式信息一起传递,以重建以前的地图。

我遇到的问题是,当我尝试应用样式时,地图尚未检索要在地图上显示的要素列表。

查看文档我没有看到任何专门针对loadGeoJson方法的事件,但确实看到了addfeature和setgeometry,但是在使用loadGeoJson方法时都没有引发这些事件。

这一切都是用Typescript编写的,并试图遵循一个非常严格的MVVM方法,使用Knockout通过绑定来处理所有UI更改。

是否还有另外一个事件我可以看看这个方法何时完成,所以我可以适当地应用我的风格?

还有另一种方法可以让我在某个地方“等待”吗? 。

3 个答案:

答案 0 :(得分:9)

addfeature事件肯定是由loadGeoJson调用的,如果不适合你就是一些设置错误。

loadGeoJson有一个可选的回调参数,在加载所有功能并将功能作为参数后调用。

https://developers.google.com/maps/documentation/javascript/3.exp/reference

  

loadGeoJson(url:string,options?:Data.GeoJsonOptions,   回调:函数(阵列))

您可以通过此回调发出代码,表明它可以继续处理。

map.data.loadGeoJson('google.json', null, function (features) {
    map.fitBounds(bounds); // or do other stuff what requires all features loaded
});

您还可以将loadGeoJson包装到promise中,并在loadGeoJson的回调中解析promise。

function loadGeoJson(url, options) {
    var promise = new Promise(function (resolve, reject) {
      try {
        map.data.loadGeoJson(url, options, function (features) {
            resolve(features);
        });
      } catch (e) {
        reject(e);
      }
    });

    return promise;
}

// Somewhere else in your code:
var promise = loadGeoJson('studs.json');

promise.then(function (features) {
    // Do stuff
});

promise.catch(function (error) {
    // Handle error
});

答案 1 :(得分:1)

您可以收听针对json中每个功能触发的addFeature事件。例如如果您使用https://storage.googleapis.com/maps-devrel/google.json,则在完成json请求之后引发六个事件,即当google api开始添加json文件中的功能时:

enter image description here

您可以在此处查看演示:http://jsbin.com/ofutUbA/4/edit

答案 2 :(得分:0)

如果您使用淘汰赛,可以假设可能绑定到某些侦听器,或者将侦听器附加到事件。

通过JavaScript的大多数事件总是有一个回调函数,这是很好的实践,所以一旦函数完成执行一些长I/ODatabase查询,它将立即执行该函数。显然回调将由您定义。

someLongTimeFunction(function (data) {
  // usually this callback will be fired when the function has finished.
});

如果您熟悉淘汰赛,那么您就会知道,一旦检索到数据并且您通过了observable observable将更新其绑定。

以下是扩展可观察量的链接:knockout js

据我所知,这个loadGeoJson,是服务器端吗?如果是这样,你会从客户端进行一次长时间的调查并与之相关:

function doRequest() {
  var request = $.ajax({
    dataType: "json",
    url: 'loadGeoJson',
    data: data,
  });

  request.done(function(data, result) {
    if (result !== "success") {
      setTimeout(doRequest, 10000);
    }
  });
}