我在谷歌地图代码中处理这个问题,但它实际上是一个架构问题。在某些时候因为这么多的要求谷歌地图限制了响应,并且在那一点上我想提出另一个延迟请求,但是当我再次调用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);
});
}
}
答案 0 :(得分:6)
那是因为当你使用setTimeout()
的代码串时,它会在全局范围内执行,而范围不知道array
。全球范围也不会知道i
;即使它确实如此,i
的价值无论如何已经不再有效了。
如果将函数代码包装在匿名函数中,它应该可以工作,如下所示:
setTimeout(function() {
function2(start, end);
}, 5000);
请注意,您只需在此处重复使用start
和end
,因为这些值已受到i
变量的保护。
答案 1 :(得分:0)
setTimeout中的函数在单独的作用域中执行,而不是在数组变量的作用域内。您可以将其包装在匿名函数中。
见这里: How can I pass a parameter to a setTimeout() callback?
所以你的代码是:
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语句的代码缺少大括号{}。我添加了这些。