gpt4 book ai didi

Javascript 回调函数和递归

转载 作者:可可西里 更新时间:2023-11-01 01:28:47 26 4
gpt4 key购买 nike

这是一个脑筋急转弯的问题,因为代码按原样运行得非常好,它只是稍微刺激了我的审美。我正在转向 Stack Overflow,因为我自己的大脑现在正在让我失望。

下面是一段代码,它使用 Google Maps JS API 查找地址并在 map 上放置标记。但是,有时初始查找会失败,所以我想用不同的地址重复该过程。

geocoder.getLatLng(item.mapstring, function(point) {
if (!point) {
geocoder.getLatLng(item.backup_mapstring, function(point) {
if (!point) return;
map.setCenter(point, 13);
map.setZoom(7);
map.addOverlay(new GMarker(point));
})
return;
}
map.setCenter(point, 13);
map.setZoom(7);
map.addOverlay(new GMarker(point));
})

(getLatLng 的第二个参数是回调函数。)

当然你可以看到居中缩放 map 和添加标记的三行是重复的,一次在主回调中,一次在“回退回调”中(哈哈)。你能找到一种方法来表达整个事情而没有任何冗余吗?如果您的解决方案适用于任意数量的备份映射字符串,您将获得奖励积分和我的奉承。

最佳答案

其他答案都不错,但这里还有一个选项。这允许您保持与开始时相同的形式,但使用命名 lambda 函数的技巧,以便您可以递归地引用它:

mapstrings = ['mapstring1', 'mapstring2', 'mapstring3'];

geocoder.getLatLng(mapstrings.shift(), function lambda(point) {
if(point) {
// success
map.setCenter(point, 13);
map.setZoom(7);
map.addOverlay(new GMarker(point));
}
else if(mapstrings.length > 0) {
// Previous mapstring failed... try next mapstring
geocoder.getLatLng(mapstrings.shift(), lambda);
}
else {
// Take special action if no mapstring succeeds?
}
})

第一次使用符号“lambda”,是作为一个新的函数字面量名称引入的。第二次使用,就是递归引用。

函数文字命名在 Chrome 中有效,我认为它在大多数现代浏览器中都有效,但我没有测试过它,我不知道旧版浏览器。

关于Javascript 回调函数和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com