【问题标题】:js pass object to callback function [closed]js将对象传递给回调函数[关闭]
【发布时间】:2016-01-09 15:10:48
【问题描述】:

我想在地理编码器回调函数中引用项目对象。 如果我使用下面的代码,Item 总是指最后一次 $each 迭代的状态。我认为这是因为回调是在 $each 循环完成后运行的。因此,我需要将项目对象传递给地理编码器。我该怎么做?

 $.each(results.data, function(index) {
        var item = results.data[index];
        geocoder.geocode( { 'address': address}, function(results, status) {
            item.lat = results[0].geometry.location.lat();
            item.lng = results[0].geometry.location.lng();
        });
    });

【问题讨论】:

  • 您的操作方式应该可以正常工作。是什么让你认为它总是指向最后一项?你永远不会在你共享的代码中测试它的价值。您需要提供一个真实的测试用例:sscce.org
  • 疯狂猜测:当您创建 results.data 时,您将多个对 same 对象的引用副本放入数组中。
  • 变量results 在这里永远不会改变,你总是选择第一个元素,所以我猜结果应该总是第一个元素?
  • 除非您的geocode 为相同的results 返回不同的results,或者您以某种方式在每次迭代中修改address。我假设它在更高的范围内,因为它没有在函数的任何地方声明。
  • @MinusFour 结果确实会发生变化,因为它始终是地理编码器回调函数提供的不同对象。 (即地理编码运行多次并每次返回不同的结果对象。)这可能令人困惑,因为回调结果与每个迭代器使用的结果不同

标签: javascript callback


【解决方案1】:

不完全理解这个问题,所以也许这无济于事,但您是否正在尝试做类似的事情:

results.data.forEach(function(item) {
    geocoder.geocode( { 'address': address}, function(results, status) {
        item.lat = results[0].geometry.location.lat();
        item.lng = results[0].geometry.location.lng();
    });
});

这将确保对项目的引用是正确的。如果它是一个对象,您可以使用 Lodash 的 forOwn 而不是 forEach。如果你真的想使用 jQuery,那么回调的第二个参数就是 item。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2022-08-02
    • 2016-09-03
    • 1970-01-01
    • 2015-11-23
    • 2019-08-07
    • 2014-10-02
    相关资源
    最近更新 更多