以合理的性能在 Asana 中获取递归任务
Getting Recursive Tasks in Asana with reasonable performance
我正在使用 Asana REST API 迭代工作区、项目和任务。在完成对数据的初步爬取后,我惊讶地发现我只检索了顶级任务。由于我需要提供工作区和项目信息,因此我希望不必再进行更深入的递归。看来我可以使用 \subtasks
端点递归执行单个任务并重新查询... wash/rinse/repeat... 但这相当于潜在的大量 REST 调用(每个子任务一个看看他们是否有子任务要查询 - 等等)。
我可以通过添加到 opt_fields
查询参数来部分缓解这种情况:
&opt_fields=subtasks,subtasks.subtasks
但是,这并不能很好地扩展。这意味着我必须延长每一层深度的查询。我想我可以说 "don't put tasks deeper than x layers deep" - 但这似乎与 Asana 的功能和设计背道而驰。此外,由于我需要许多其他属性,因此需要我对层次结构中的每个节点进行二次查询以收集这些属性。呃。
我可以使用 path method 来稍微缓解一下:
&opt_fields=(this|subtasks).(id|name|etc...)
但同样,我必须对每一层深度都这样做。那是不切实际的。
有关于这个出色的 REPEATER +
运算符的文档。据说它会像这样工作:
&opt_fields=this.subtasks+.name
这应该适用于层次结构中任何位置的所有子任务。实际上,这完全被打破了,REST API 窒息而 returns 只有顶级任务的 ID。 :( 显然他们的文档在这里是错误的。
唯一似乎远程起作用(如果不实用)的方法是首先迭代顶级任务,确保包括 opt_fields=subtasks
。只要这是一个非空数组,我就需要递归执行该任务,查询它的 subtasks
,然后以这种方式继续,直到我到达一个空 subtasks
数组。这可以是任意深度。在实践中,第一个 REST 调用为我(希望)产生了最大数量的任务,因此单个递归可能会被真实数据减轻......但这是一个假设。
我还注意到 limit
参数仅适用于顶级任务。如果我选择 expand
子任务,比如说。我可以取回一千个任务,而不是 100 个。如果数据太大,调用可能会超时。最安全的做法是在递归之前只请求 id
的子任务,并且一如既往地在那个时候请求所有需要的顶级属性。
所有这一切看起来都非常浪费 - 我真正想要的是一个简单的任务列表,其中包括 parent.id
和可能的 subtasks.id
列表 - 但我不想查询他们分层。我还想在考虑合理数据大小的情况下对我的查询进行分页。我想一次完成 100 个任务,直到 Asana 用完 - 但这似乎不可能,因为该限制仅适用于顶级项目。
不幸的是中继器没有解决我的问题,因为它根本不起作用。其他人正在做什么来解决这个问题?其次,任何具有 Asana 洞察力的人都可以提供获得更好查询方式的希望吗?
虽然我在做,但建议的设计方法是:任务端点不应需要工作区或项目谓词。我应该能够按它们进行过滤,但不是必须的。我已经限制为 100 个对象,为什么要强制我进行不必要的过滤?同样 - 对于不是 Asana 的客户(甚至可能是 Asana UI 本身)来说,浏览 Asana 的层次结构似乎是一种不必要的负担。
有什么想法或见解吗?
你确定你发送的 + 是 URL 编码的吗?无论您使用的是什么库,通常都应该处理这个问题(顺便说一句,您使用的是哪种语言?我们有一些 first-party client libraries 可用)
如果您手动创建 URL,请尝试 &opt_fields=this.subtasks%2B.name
,或者(更好)使用正确编码 URL 查询参数的库。
我正在使用 Asana REST API 迭代工作区、项目和任务。在完成对数据的初步爬取后,我惊讶地发现我只检索了顶级任务。由于我需要提供工作区和项目信息,因此我希望不必再进行更深入的递归。看来我可以使用 \subtasks
端点递归执行单个任务并重新查询... wash/rinse/repeat... 但这相当于潜在的大量 REST 调用(每个子任务一个看看他们是否有子任务要查询 - 等等)。
我可以通过添加到 opt_fields
查询参数来部分缓解这种情况:
&opt_fields=subtasks,subtasks.subtasks
但是,这并不能很好地扩展。这意味着我必须延长每一层深度的查询。我想我可以说 "don't put tasks deeper than x layers deep" - 但这似乎与 Asana 的功能和设计背道而驰。此外,由于我需要许多其他属性,因此需要我对层次结构中的每个节点进行二次查询以收集这些属性。呃。
我可以使用 path method 来稍微缓解一下:
&opt_fields=(this|subtasks).(id|name|etc...)
但同样,我必须对每一层深度都这样做。那是不切实际的。
有关于这个出色的 REPEATER +
运算符的文档。据说它会像这样工作:
&opt_fields=this.subtasks+.name
这应该适用于层次结构中任何位置的所有子任务。实际上,这完全被打破了,REST API 窒息而 returns 只有顶级任务的 ID。 :( 显然他们的文档在这里是错误的。
唯一似乎远程起作用(如果不实用)的方法是首先迭代顶级任务,确保包括 opt_fields=subtasks
。只要这是一个非空数组,我就需要递归执行该任务,查询它的 subtasks
,然后以这种方式继续,直到我到达一个空 subtasks
数组。这可以是任意深度。在实践中,第一个 REST 调用为我(希望)产生了最大数量的任务,因此单个递归可能会被真实数据减轻......但这是一个假设。
我还注意到 limit
参数仅适用于顶级任务。如果我选择 expand
子任务,比如说。我可以取回一千个任务,而不是 100 个。如果数据太大,调用可能会超时。最安全的做法是在递归之前只请求 id
的子任务,并且一如既往地在那个时候请求所有需要的顶级属性。
所有这一切看起来都非常浪费 - 我真正想要的是一个简单的任务列表,其中包括 parent.id
和可能的 subtasks.id
列表 - 但我不想查询他们分层。我还想在考虑合理数据大小的情况下对我的查询进行分页。我想一次完成 100 个任务,直到 Asana 用完 - 但这似乎不可能,因为该限制仅适用于顶级项目。
不幸的是中继器没有解决我的问题,因为它根本不起作用。其他人正在做什么来解决这个问题?其次,任何具有 Asana 洞察力的人都可以提供获得更好查询方式的希望吗?
虽然我在做,但建议的设计方法是:任务端点不应需要工作区或项目谓词。我应该能够按它们进行过滤,但不是必须的。我已经限制为 100 个对象,为什么要强制我进行不必要的过滤?同样 - 对于不是 Asana 的客户(甚至可能是 Asana UI 本身)来说,浏览 Asana 的层次结构似乎是一种不必要的负担。
有什么想法或见解吗?
你确定你发送的 + 是 URL 编码的吗?无论您使用的是什么库,通常都应该处理这个问题(顺便说一句,您使用的是哪种语言?我们有一些 first-party client libraries 可用)
如果您手动创建 URL,请尝试 &opt_fields=this.subtasks%2B.name
,或者(更好)使用正确编码 URL 查询参数的库。