6

目前程序正在运行,但是由于alert()我在函数中使用的getData()函数,界面很烦人!当我从函数中删除这一行时,getData()整个程序出错了!!我不知道是什么问题?有人有更好的主意来做这样的过程吗?

我在这里尝试制作的程序旨在帮助用户找到距当前地址50公里内的餐厅,我已经收集了各种位置地址并将其记录在数据库中。

initialize()加载 HTML 正文时调用的函数,在 HTML 正文的第一行中,餐厅数据将使用 PHP 从 MySQL 中提取,PHP 会将数据打印到 JavaScript 数组 jsres_add、jsres_id、jsres_name 和 jsnu 中,以便我可以在 JavaScript 代码中使用它们。*请注意下面的JavaScript代码是分开在.js文件中的

var geocoder, location1, location2, gDir, oMap, jsnu, arraynu, address2;
jsres_add = new Array();
jsres_id = new Array();
jsres_name = new Array();

function initialize() {
    geocoder = new GClientGeocoder();
    gDir = new GDirections();
    GEvent.addListener(gDir, "load", function() {
        var drivingDistanceMiles = gDir.getDistance().meters / 1609.344;
        var drivingDistanceKilometers = gDir.getDistance().meters / 1000;
        if (drivingDistanceKilometers < 50){
            // function to save search result within 50km into database using ajax
            saveSearchResult(jsres_id[arraynu],jsres_name[arraynu],drivingDistanceKilometers);
        }
    });
}

function getData() {
    emptytable(); //function to empty search result table using ajax
    //jsnu is the number of the restaurants data found in database
    for (var ii = 0; ii < jsnu; ii++) {
        arraynu = ii;
        address2 = jsres_add[ii];
        showLocation();
        alert("done!");
    }
    showResults(); //function to print out the search result from database into html body using ajax
}

function showLocation() {
geocoder.getLocations(document.forms[0].address1.value, function (response) {
    if (!response || response.Status.code != 200){
        alert("Sorry, we were unable to geocode your address");
    }else{
        location1 = {lat: response.Placemark[0].Point.coordinates[1], lon: response.Placemark[0].Point.coordinates[0], address: response.Placemark[0].address};
        geocoder.getLocations(address2, function (response) {
            if (!response || response.Status.code != 200){
                alert("Sorry, we were unable to geocode the second address");
            }else{
                location2 = {lat: response.Placemark[0].Point.coordinates[1], lon: response.Placemark[0].Point.coordinates[0], address: response.Placemark[0].address};
                gDir.load('from: ' + location1.address + ' to: ' + location2.address);
            }
        });
    }
});
}
4

2 回答 2

3

如果功能的存在使代码工作,我猜这是与时间有关的问题,特别是在收到地理编码器服务的响应之前alert(),您似乎被覆盖了。address2

[编辑]

在你设置了 jsfiddle 之后,我更仔细地检查了你的代码并让它工作:

http://jsfiddle.net/zuYXS/16/

address2确实被覆盖了,但这不是唯一的问题,事实上你使用的所有变量都是全局的。特别是,我必须为GDirections您提出的每个请求创建一个实例(共享一个会在显示之前覆盖第一个结果)。

要了解您的代码为什么不起作用,我建议您搜索和研究一些有关异步方法调用的材料。

同样作为一般经验法则(对于 Javascript 和一般编程)尽量避免将变量放在全局范围内,但将它们的生命限制在尽可能小的范围内,这将在很多方面有所帮助:它将减少变量名称冲突,同时提高性能(变量仅在必要时存在)和代码的可读性(更容易跟踪值)。

于 2012-12-06T10:50:29.327 回答
2

路线服务是异步的,您不能从中返回任何内容,您需要在回调例程中使用从服务器返回的数据。

您正在使用 Google Maps API v2 语法;该 API 已弃用,并且在 2013 年 5 月 19 日之后将不再受支持。强烈建议不要使用该 API 版本进行新开发。

重新编写代码以使用Google Maps API v3

于 2012-12-06T22:22:25.303 回答