当前位置: 首页 > 知识库问答 >
问题:

Async–由多个基于promise的API调用形成的Orgchart,这些调用返回相互依赖的数据

万俟亦
2023-03-14

我正在制作一个组织图表,以网格状的形式显示单元的层次结构。对API的调用返回一个JSON对象,该对象包含一个单元及其所有子单元的数组。父母和孩子都有ID和其他一些杂项数据。为了使图表性能最佳,我不会加载比浏览器窗口中更适合的“行”。我遵循的设计约束确定了父节点正下方的子节点应该是中间的子节点。在加载了所有适合初始浏览器窗口的单元后,它们需要接收适当的样式,将它们放置在CSS网格中。

假设我们有五行空间Math.floor(window.innerHeight/150)

API以单元ID作为查询,如果传递0,则获得顶级单元。检索前两行(父行)的步骤

然后,我们需要找到中心孩子,并根据其ID进行新呼叫

let centre = Math.floor(responseFromPreviousCall.children.length / 2);
fetch(`…/api/org/${responseFromPreviousCall.children[centre].id}`);

我们现在有3行数据。最后一步需要再做两次,所以我们有5行。同样,适合初始浏览器窗口的行数可能会更改。我以5为例。

在接收到所有数据之后,我需要检查哪些行具有最多的子行,这样我就可以为整个CSS网格设置列数。然后我可以开始做必要的DOM操作和CSS样式,以显示网格中的所有数据。这样做时,我觉得将上述API调用生成的数据放在一个对象中会很好。

如果代码是同步的,这不会是一个问题,但是读取是基于promise的,因此引入了异步世界。我不想阻塞主线程,所以我知道异步是理想的。我不能绕着做顺序的API调用,在这些调用中,上一次调用的数据是必要的,并且下一次调用可以访问。如果有可能最终得到一个包含不同“行”的单一对象,我可以在检索必要的数据后进行DOM操作/样式化时访问这些对象。

任何建议/输入都非常感谢!


共有1个答案

邹博裕
2023-03-14

这是一种promise比回调更容易让你生活的情况。

一般的想法是:

>

  • 创建一个async函数,该函数将返回一个API调用(即promisify您的API调用)
  • 创建一个async函数,该函数将返回一个包含构建对象的对象和一组行({result:{id:0,children:[{…},{…}),rows:[0:[{…}],1:[{…},{…}],2:[{…},{…},{…}}
  • 在其中,等待记录的API请求0,并将其用作“根目录”(或者,如果网格被滚动并且您正在加载更多内容,则在第一行中添加一些过去的行)
  • 循环查看所需的后续行数

    • 循环上一行中的父对象,并获得每个父对象的子对象,将它们附加到相应的父对象以及相应的行数组(因此您可以轻松获得计数)
      • 等待调用获取一项功能
      • 将获得的项目放在其父级的子属性(或类似属性)中,也放在正确的行数组中

      返回结果,该结果包含对象树和行数组

      笔记:

      • 查看Promise.all作为同时请求一行中所有子行的一种手段,或者一些受限制的实现,一次执行多个请求
      • 如果您有权限修改API,那么添加一个需要深度的树endpoint会更有效。根据图表的大小,返回一个完整的树可能比执行几十个请求更有效。或者,您的树endpoint可以接受starLevel和endLevel,并且只返回一个部分。

  •  类似资料:
    • 问题内容: 我有一种方法可以抓取网页并将数据保存到文件中(请参见下面的示例代码)。我需要测试结果数据是否格式正确。 问题是,数据是从一系列调用中接收到的,并且进一步的调用使用了先前调用的结果。更糟糕的是,许多涉及的调用都是在具有不同参数的相同对象(a ,a 和模块)上完成的。 我看到 可以模拟一个简单调用或一系列简单调用的结果,但是看不到如何实现像这样纠缠的东西。我看到的唯一方法是手动重新实现该方

    • 问题内容: 我想在click事件中进行三个Ajax调用。每个ajax调用都会执行不同的操作,并返回最终回调所需的数据。调用本身并不相互依赖,它们可以同时进行,但是当三个都完成时,我希望有一个最终的回调。 问题答案: 这是我写的一个回调对象,您可以设置单个回调以在全部完成后触发,也可以让每个回调都有自己的回调并在全部完成后触发它们: 注意 从jQuery 1.5+开始,您可以按照另一个答案中所述使用

    • 我正在使用节点8.x。因此,我可以访问所有最新的特性,如异步/等待等。 该场景类似于以下内容(语法不正确,仅供解释): 基本上,User对象的创建依赖于address对象的创建。我希望createUser函数异步执行,即尽快返回一个promise而不等待address对象的创建。 这个问题的目的不是完成任务,而是了解在异步编程中解决这类问题的最佳方法是什么。 我能想到的方法不多:1:创建一个新的p

    • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

    • 问题内容: 我不太了解jQuery的魔术延迟对象。假设以下代码: 我要执行的操作的顺序是这样的-最后,我将调用四个Web服务,而调用彼此依赖(一个长链): 呼叫 依存呼叫 依存呼叫 调用依赖于和 如您所知2和3可能同时发生。我想我可以使用(或?),我只是不知道如何在这里应用它。我想我需要重新编写功能以始终返回ajax对象? 伪代码如下所示: 问题答案: $ .ajax返回jQuery承诺。然后,您

    • 问题内容: 考虑一下代码: 路线: 解决: 上面我在一个嵌套了两个调用,因为它们依赖于父调用返回的数据。 我想做的是 :在所有解析器都已完成而不只是父调用完成后返回解析器。 我无法使用$ q.all(),因为其中有两个调用依赖于第一个调用。 简而言之,必须在完成所有3个调用之后才加载myAppController。 问题答案: 您应该使用chaining promise和$ q服务来解决您的问题。