0

我正在我的谷歌地图代码中处理这个问题,但它实际上是一个架构问题。在某些时候,由于请求太多,谷歌地图限制了响应,那时我想延迟发出另一个请求,但是当我再次调用 function2 时,它说“数组未定义”。

function1() {
    var array = JSON.parse(xmlhttp.responseText);

    for (i; i < length; < i++) {
        function2(array[i].one, array[i].two);
    }

    function3() {
        //render directions
    }

    function2(start, end) {
        directionsService.route({
            origin: start,
            destination: end,
        },

        function (result, status) {
            if (status == google.maps.DirectionsStatus.OK)
                function3(result);
            else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT)
                var functionStr = "function2(array[i].one" + ',' + "array[i].two)";
            setTimeout(functionStr, 5000);
        });
    }

}
4

2 回答 2

6

那是因为当你使用一串代码时,setTimeout()它会在全局范围内执行,它不知道array. 全局范围也不会知道i;即使确实如此,i无论如何, 的值也已经不再有效。

如果您将函数代码包装在匿名函数中,它应该可以工作,如下所示:

setTimeout(function() {
    function2(start, end);
}, 5000);

请注意,您可以在此处简单地重用startend,因为这些值已受到保护,不会更改i变量。

顺便说一句,您可以考虑序列化您的所有 Google 请求,即一个接一个的请求,以防止出现这些速率问题。

于 2013-03-26T10:46:23.680 回答
0

setTimeout 中的函数在单独的范围内执行,而不是在数组变量的范围内。您可以将其包装在匿名函数中。

请参见此处: 如何将参数传递给 setTimeout() 回调?

所以你的代码是:

   function (result, status) {
            if (status == google.maps.DirectionsStatus.OK) {
                function3(result);
            } else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function () {
                    function2(array[i].one, array[i].two);
                }, 5000);
            }
        });

请记住,您的代码缺少 if elseif 语句的大括号 {}。我已经添加了这些。

于 2013-03-26T10:49:23.177 回答