jquery在for循环中延迟

2024-02-08

所以我一直在研究 jquery deferred,但在循环中检索数据时遇到问题。延迟部分似乎只处理最终迭代中的数据。如果数组中只有一项,它也会失败,所以我不确定发生了什么。

我有各种城市名称,我试图从谷歌地图反向地理编码中获取每个城市的中心坐标

这是我获取中心坐标的函数:

function getGroupLatLng(groupname){
    var deferred = new $.Deferred();

     geocoder.geocode( { 'address': groupname}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
              deferred.resolve(results);

          alert(results[0].geometry.location.lat());
      } else {

      }

    });
    return deferred.promise();
}

这是调用该函数的地方,并且在返回结果后附加一个 div:

var newGroupsLength = newGroups.length;

for (i = 0; i < newGroupsLength; i++) {

    newGroups[i]['counter']=counter;
    var locationName = newGroups[i]['name'];
    counter++;
    alert(locationName);
    $.when(getGroupLatLng(locationName)).then(function(results){
        alert("lat = "+results[0].geometry.location.lat());
        var lat=results[0].geometry.location.lat();
        var lng=results[0].geometry.location.lng();
        console.log(newGroups[i]); //this is running the proper number of times, but it logs the results from the final looped item, 'n' number of times. 

        newGroups[i]['lat']=lat;
        newGroups[i]['lng']=lng;

        var jsonArray=[];
        jsonArray = newGroups[i];
        var template = $('#groupsTemplate').html();
        var html = Mustache.to_html(template, jsonArray);
        $('#groups-container').append(html);
    });
}

我遇到的问题是,延迟循环似乎处理了 for 循环中的最后一个项目“n”次,其中“n”是 newGroupsLength 数组中的项目数。当然,它应该对每一项进行一次处理。如果删除延迟操作,则一切正常。

真诚感谢您的任何帮助。非常感谢


有两个事实共同作用才能得出这个结果:

  1. 将对象写入日志时,写入的是对对象的引用,而不是数据的副本。如果对象在记录后发生更改,日志将显示更改的数据。

  2. 在回调函数 for 之前循环已经完成then被称为第一次。这意味着i所有回调将具有相同的值,因此您将所有结果放在同一个对象中。

所以,值在newGroups[i]将会针对处理的每个响应而更改,但您只会看到日志中的最后一个值,因为这是日志显示时对象包含的内容。

使循环中的每次迭代都保持i稍后当响应到达时,您可以使用 IIFE(立即调用函数表达式)为每次迭代创建一个局部变量:

var newGroupsLength = newGroups.length;

for (i = 0; i < newGroupsLength; i++) {

  (function(i){

    newGroups[i]['counter']=counter;
    var locationName = newGroups[i]['name'];
    counter++;
    alert(locationName);
    $.when(getGroupLatLng(locationName)).then(function(results){
        alert("lat = "+results[0].geometry.location.lat());
        var lat=results[0].geometry.location.lat();
        var lng=results[0].geometry.location.lng();

        newGroups[i]['lat']=lat;
        newGroups[i]['lng']=lng;

        console.log(newGroups[i]); // log the object after setting the values

        var jsonArray=[];
        jsonArray = newGroups[i];
        var template = $('#groupsTemplate').html();
        var html = Mustache.to_html(template, jsonArray);
        $('#groups-container').append(html);
    });

  })(i);

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jquery在for循环中延迟 的相关文章

随机推荐

  • 将自定义控件中的编辑框动态绑定到托管 bean

    我读过许多关于在自定义控件中动态绑定字段的优秀帖子和文章 但它们都假设了文档数据源 我想允许托管 bean 数据源的可能性 我尝试将属性类型设置为com ibm xsp model DataSource or com ibm xsp ext
  • Enunciate 能否为处理泛型类型的 API 生成文档?

    给定一个抽象的通用 Resource 类和一个具体的实现 public abstract class AbstractResource
  • 如何阻止混淆整个包?

    我需要防止 Proguard 混淆包中的任何类com foo 我努力了 keep com foo
  • 如何模拟当前日期?

    我的代码中有一个方法可以验证当天是否正常工作 它会为此检查数据库日历 方法如下所示 public boolean iBusinessDayToday LocalDate today LocalDate now logic with toda
  • 基于属性值的条件(XML 架构)

    是否可以在 XML 模式中定义基于属性值的条件 例如 当test attrib one 我想one element被允许和强制或当test attrib two 我想two element是允许的和强制性的 例如 有效文件是
  • 如何使用控制台生产者在 Kafka 0.11 中生成带有标头的消息?

    如何使用控制台生产者在 Kafka 0 11 中生成带有标头的消息 我在Kafka文档中没有找到任何关于此的描述 Update 从 Kafka 3 2 开始 您可以使用以下命令生成带标题的记录kafka console producer s
  • 将变量从组件传递到模型范围

    我正在使用基于 Laravel 的 OctoberCMS 我正在尝试从 URL 获取标识符并将其传递到范围以过滤数据库结果 this gt property username 起作用并从 URL 返回用户名 但是如何将它传递给模型和范围函数
  • JSON 点符号转字符串

    我在 javascript 中使用 JSON 并且尝试获取点表示法表示的字符串值 例如AAA BBB 0 CCC DDD 5 EEE 123 采用 JSON 点表示法格式 但我想获得价值AAA BBB 0 CCC DDD 5 EEE作为字符
  • 我可以有一个模板函数指针的 std::vector 吗?

    我有一个模板函数 我想将它的指针存储在std vector 该函数如下所示 template
  • 在easeljs中添加一个简单的图像

    这是我的 html 代码
  • css 字体大小和行高与基线不匹配

    我正在尝试做一些应该非常简单的事情 但我在失败和论坛之间度过了一天 我想调整我的字体以匹配我的基线 在 indesign 中只需点击一下即可 但在 css 中这看起来是地球上最困难的事情 让我们举一个有理值的简单例子 在这张图片上 我每 2
  • SQL 查询检查名称是否以元音开头和结尾

    我想查询名单CITY表中的名称STATION id city longitude latitude 它们的第一个和最后一个字符都是元音 结果不能包含重复项 为此 我写了一个查询 例如WHERE NAME LIKE a 它有 25 个条件 每
  • Webpack启动,导入错误

    我正在开始使用 Webpack 但已经遇到了以下问题 我创建了一个 app index js 文件 如文档中指定的 我还创建了一个 index html 文件 从文档中复制了 HTML 和 CSS 我在 CLI 中运行了正确的命令 包括生成
  • Artifactory 缺少 Android 依赖项

    相关找不到runtime jar android arch lifecycle runtime 1 0 0 https stackoverflow com questions 50563338 could not find runtime
  • 如何仅选择 BLOB 列的一部分

    在 SQLite 数据库中 如何从 BLOB 字段中仅选择 1kb 我想象它是这样的 SELECT PART field name startIndex bytes AS data FROM table 这可能吗 Use substr ht
  • JTextArea 中 setText() 的机制?

    我尝试在我的中显示一些文字JTextArea在运行时 但是当我使用循环时setText按顺序显示文本 它只显示最后一个循环的文本 这是我的代码 private void jButton1ActionPerformed java awt ev
  • 如何仅选择巨大二进制文件(文件)的一部分?

    我的问题是这样的 我有可能将巨大的文件存储在 SQL Server 2008 上的二进制 图像 字段中 gt 1GB 如果我使用常规 select 语句返回整个二进制文件 则查询需要一分钟多的时间才能将结果返回到我的 NET 程序 并且我的
  • Android 11 (R) 文件路径访问

    根据文档 Android R 中授予文件路径访问权限 从 Android 11 开始 具有 READ EXTERNAL STORAGE 权限的应用可以使用直接文件路径和本机库读取设备的媒体文件 这项新功能使您的应用程序能够更顺畅地与第三方媒
  • 如何制作全宽 SwiftUI 列表?

    我想要我的List为全宽 填充是自动添加的 出于我的目的 我不希望这样 这只是示例代码 这是我的代码 struct ViewModel Identifiable let title String let id UUID struct Con
  • jquery在for循环中延迟

    所以我一直在研究 jquery deferred 但在循环中检索数据时遇到问题 延迟部分似乎只处理最终迭代中的数据 如果数组中只有一项 它也会失败 所以我不确定发生了什么 我有各种城市名称 我试图从谷歌地图反向地理编码中获取每个城市的中心坐