Javascript 回调函数和递归

标签 javascript recursion callback

这是一个脑筋急转弯的问题,因为代码按原样运行得非常好,它只是稍微刺激了我的审美。我正在转向 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/

相关文章:

java - JSF 2.0 AJAX : Call a bean method from javascript with jsf. ajax.request(或其他方式)

javascript - 如何将 jQuery 添加到 SoloLearn Playground 部分?

javascript - 如何将 JavaScript 对象分成多个文件

python - 最大和子数组 - 分而治之

javascript - 测试失败 - 多次调用 Mocha 的 done()

javascript - 如何在 Javascript 中使用 ,function (){ 实现回调函数

javascript - 如何检查一个输入的多个值

Prolog 中的递归和列表

c++ - 尾调用优化是否适用于此功能?

javascript - 为什么在回调中声明一个 var 会取消定义参数? (吊装)