如何强制回调方法等待 Google 标记创建

2023-12-03

我正在使用 Google 地图库制作一个应用程序。我的问题是创建标记时出现无法解释的延迟,或者出现我看不到的异步问题。

解释 : 该代码沿着起点和终点之间的路线获取充电站位置,为获取返回的每个充电站创建 Google 标记(以 Json 格式),并将它们推送到数组中。稍后,它应该使用这些标记(此处未包括)来计算包含中途停留的路线。

问题是它在完成创建标记之前启动计算方法。

为了协调结果,我不会立即获取所有结果。相反,我做了一个循环来执行以下操作:

  1. 创建一条路线并从中提取编码的多段线(将在 URL 中使用)
  2. 获取结果
  3. 创建标记,将它们设置在地图上并将它们推送到数组上
  4. 登录控制台工作已完成(“EV 标记创建完成”)

然后它启动路线计算过程(这里替换为调用的警报“calculateAndDisplayRoute 方法”)

但实际上,循环完成并登录到控制台,但最后一个标记尚未创建,警报已启动,只有在此之后您才能看到标记出现在地图上。

您可以尝试以下代码片段:https://codepen.io/revilo85k/pen/wvowpab

这是有问题的代码(我必须在代码笔中添加更多代码才能使其正常工作):

chargingPointsMarkers = [];
markerArray = [];

async callbackHandler(startEndPointsArray, calculateAndDisplayRoute): Promise<void> {
    await this.setChargingStationsMarkers();
    calculateAndDisplayRoute();
  }

function calculateAndDisplayRoute() {
      alert('calculateAndDisplayRoute method called')
    }

  async function setChargingStationsMarkers() {
const polylineMarkersArray = await createMarkersArray();
console.log('Polyline Markers created', polylineMarkersArray);

    const baseUrl = 'URL REMOVED';

    for (let j = 0; j < polylineMarkersArray.length - 1; j++) {
      const origin = polylineMarkersArray[j].getPosition();
      const destination = polylineMarkersArray[j + 1].getPosition();
      
      const route = await createRoute(origin, destination);
      const encodedPolyline = route.overview_polyline;
      const queryUrl = baseUrl + '&polyline='+ encodedPolyline + '&distance=50';

      await fetch(queryUrl)
        .then((response) => response.json())
        .then( async (data) => await createChargerPointMarkers(data))
        .then (() => {
                   const k = j + 1;
          const l = polylineMarkersArray.length - 1;
          if (j === polylineMarkersArray.length - 2) {
            console.log('loop ' + k + ' of ' + l);
            console.log('EV markers creation finished');
          }else{
            console.log('loop ' + k + ' of ' + l);
          }
        });
    }
}

async createChargerPointMarkers(jsonChargingPoints): Promise<void> {
    // Convert the Json response elements to Google Markers, places them on the Map and pushes them to an array.
    for (const item of jsonChargingPoints) {
      const LatLng = new google.maps.LatLng(parseFloat(item.AddressInfo.Latitude), parseFloat(item.AddressInfo.Longitude));
      const marker = await new google.maps.Marker({
        position: LatLng,
        map: this.map,
        draggable: false,
      });
      this.markerArray.push(marker);
      this.chargingPointsMarkers.push(marker);
    }
  }

  async createRoute(point1, point2): Promise<google.maps.DirectionsRoute> {
    // Returns a Google DirectionsRoute object
    const directionsService = new google.maps.DirectionsService();
    const request = {
      origin: point1,
      destination: point2,
      travelMode: google.maps.TravelMode.DRIVING,
      unitSystem: google.maps.UnitSystem.METRIC
    };
    return new Promise(resolve => directionsService.route(request,
      (result, status) => {
        if (status === 'OK') {
          resolve(result.routes[0]);
        } else {
          window.alert('Directions request failed due to ' + status);
        }
      })
    );
  }

正如我在评论中提到的,您的代码按预期工作,问题来自于使用alert()当它被触发时,它会阻止你的浏览器执行任何进一步的代码 - 更重要的是 - 进一步的 UI 渲染。

几乎任何对 DOM 执行某些操作的代码都可以轻松重现这一点。

const el = document.createElement("div");
const text = document.createTextNode("Hello world");

el.appendChild(text);
document.body.appendChild(el);

console.log('done');
alert('done');

警报已发出after该节点已添加到 DOM 但before浏览器已经渲染了它(至少在我的浏览器中)。

更换alert()在你的代码中带有console.log()并添加另一个console.log('marker added')你在哪里创建每个google.maps.Marker()显示事件的顺序符合您的预期:

  1. (84) marker added
  2. loop 6 of 6
  3. EV markers creation finished
  4. calculateAndDisplayRoute method called

but the alert()在浏览器完成标记渲染之前触发。

你可能应该避免使用alert()出于调试目的,或谨慎使用它,因为它可能会产生误导。

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

如何强制回调方法等待 Google 标记创建 的相关文章

  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • 从函数返回函数的目的是什么?

    阅读一些遗留代码 发现 A prototype setSize function var v1 new Vector2 return function size var halfSize v1 copy size multiplyScala
  • 位置特征检测:固定

    我正在尝试找到一个脚本来检测设备是否放置position fixed元素相对于视口而不是整个文档 目前 标准桌面浏览器和 Mobile Safari 适用于 iOS 5 都是这样做的 而 Android 设备则相对于整个文档放置固定元素 我
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • Node.js 中的异步或步骤

    我无法让我的异步代码与 node js 一起使用 尝试异步和步骤库 代码仅返回第一个函数 似乎没有执行其余函数 我究竟做错了什么 thanks var step require step step function f1 console l
  • webpack TS2304 找不到名称“Map”、“Set”、“Promise”

    我有以下 webpack config js var path require path var webpack require webpack module exports entry ng2 auto complete path joi
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • Google Maps API (v3) 添加/更新标记

    编辑 它现在可以工作 但如果用户不允许或没有基于位置的服务 则不会加载 请参阅 jsfiddle 示例接受的答案评论 我已经浏览了一些教程和问题 但我无法安静地理解正在发生的事情 或者在这种情况下 没有发生 当用户单击链接时 我正在加载地图
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • 如何从 json 文件创建模型? (ExtJS)

    这是我想使用 json 文件创建的模型 Ext define Users extend Ext data Model fields name user id type int name user name type string 为了根据服
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo

随机推荐

  • 在 php 中测试给定字符的大写或小写类型的最佳方法是什么?

    无论当前本地语言如何 检测字符是大写还是小写的理想方法是什么 有没有更直接的功能 假设 将内部字符编码设置为 UTF 8 并且本地浏览器会话是 en US en q 0 5 并且已安装多字节字符串扩展 不要使用 ctype lower 或
  • 当 Typescript 具有不同的参数计数时,有没有办法让 Typescript 认为函数类型不相等?

    考虑以下代码 function typeTest callback item1 number item2 string gt number number return callback 5 foo This works typeTest n
  • 使用 ggplot2 绘图:“错误:在分类 y 轴上提供连续刻度的离散值”

    下面的绘图代码给出Error Discrete value supplied to continuous scale 这段代码有什么问题 它工作正常 直到我尝试更改比例 所以错误就在那里 我试图从类似问题中找出解决方案 但不能 meltDF
  • 删除 git 中的分支是否会将其从历史记录中删除?

    来自svn 刚刚开始熟悉git 当git中删除一个分支时 它会从历史记录中删除吗 在svn中 您可以通过恢复删除操作 反向合并 轻松恢复分支 与 svn 中的所有删除一样 分支从未真正删除 它只是从当前树中删除 如果分支实际上从 git 的
  • Linux 中的 java.lang.UnsatisfiedLinkError

    我已经成功进入 Linux 机器来尝试中建议的 HotKey 库这个答案 我已经编译了示例代码 现在运行该程序并收到以下消息 oracle machine jxgrabkey 0 2 1 i386 java classpath lib JX
  • 在 Mercurial 中合并时排除文件

    我将 Mercurial 与 TortoiseHg 一起使用 我有两个分支 A and B 有两个文件 toto cs and titi cs 当我想合并时有办法吗B with A 排除titi cs不合并 并且仅合并toto cs 如果可
  • 为什么使用await后控制台仍然退出?

    using System using System Threading using System Threading Tasks namespace application public class Files public static
  • L5.6 - 数据透视表上的关系

    我有一个关系pivot桌子 我怎样才能扩展它 例如 shops id name products id name 产品商店 产品编号 shop id field 1 field 2 field 3 表A id table A id name
  • WebSphere Message Broker - 如何发送 PCF 消息

    我们需要从 MB 流发出一些 MQ 命令 解决方法是发送 PCF 命令 但我不知道如何创建它 有什么指点吗 塞巴斯蒂安 要通过 PCF 消息向 MQ 队列管理器发出命令 您可以查看 nix 上或安装 MQ 的位置的 opt mqm samp
  • 如何删除 Postgres 中两行重复数据之一?

    我正在使用 Postgres 9 5 我有以下查询 旨在查找表中相同的数据行 但具有唯一的 ID select e name e day e distance e created at e2 created at from events e
  • 在应用程序退出时保存变量

    我有一个简单的 iPhone 应用程序 具有多个视图和 5 个不同项目的列表 这些项目附加了变量 无论用户在应用程序中的哪个位置 这些变量都会传递到每个新视图 Example var Peron1 String var Person1Age
  • 没有数据库/框架的Asp.net mvc模型

    是否有关于如何创建 ASP NET MVC 应用程序而不由数据库管理模型 通过 linq2sql 或实体框架 的教程 示例 我必须为具有基于 json 的 api 的服务器创建一个前端 我想使用 mvc 3 或 2 并且保留 mvc 的大部
  • 如何重建全部?

    在 Visual Studio 中 如何重建完整的解决方案 包括所有配置 如果我选择 重建解决方案 它总是仅重建 调试 或 仅发布 但绝不会同时重建两者 使用批量构建选项 右键单击解决方案即可查看它 这是一个屏幕截图 VS2010 但我相信
  • [Code] 部分中的数组变量和动态访问

    我的安装程序有Components与可下载文件相关联 这些东西在不同的构建中都在变化 所以我正在使用 insert来创建 Components 部分以及相应的条目 Files 部分 其中一些组件依赖于常见的可下载文件 现在 为了在下载页面中
  • 自调用onUpgrade方法

    我怎样才能打电话给onUpgrade数据库的方法 我的问题背景 我在 SD 卡上做了完整数据库的备份 用户可以恢复该数据库 但是 如果与此同时 在备份和恢复之间 应用程序更新更改了数据库 我将在恢复时遇到问题 恢复后新列不存在 所以我想打电
  • 当字符串中存在重复字母时获取匹配项

    我在谷歌表格中有一个输入列表 Input Desired Output To demonstrate only not an input The repeated letters Outdoors Match o dog No Match
  • Glassfish 3 - 从静态服务器加载图像

    我正在尝试从部署到的 Web 应用程序外部的服务器加载图像 和其他静态内容 玻璃鱼 v3 我有以下配置web xml但它不适用于 Glassfish 但适用于 Tomcat
  • 在 C# 中调整图像大小并将其发送到 OpenCV 会导致图像扭曲

    这是一个相关的后续问题this one 基本上 我有一个 DLL 它使用 OpenCV 进行图像处理 有两种方法 一种是接受image Path 另一个接受cv Mat 与我们一起工作的人image path工作正常 接受一个image是有
  • 在Javascript中声明一个空的二维数组?

    我想在 Javascript 中创建一个二维数组 用于存储坐标 x y 我还不知道我将拥有多少对坐标 因为它们将由用户输入动态生成 预定义二维数组的示例 var Arr 1 2 3 4 5 6 我想我可以使用 PUSH 方法在数组末尾添加一
  • 如何强制回调方法等待 Google 标记创建

    我正在使用 Google 地图库制作一个应用程序 我的问题是创建标记时出现无法解释的延迟 或者出现我看不到的异步问题 解释 该代码沿着起点和终点之间的路线获取充电站位置 为获取返回的每个充电站创建 Google 标记 以 Json 格式 并