如何查询我在查询Facebook Graph API的最后一页?

时间:2016-12-21 21:23:13

标签: facebook-graph-api pagination facebook-javascript-sdk

作为一项练习,我正在编写简单的(也是尽可能无状态的)客户端应用程序(在React中),在单个Facebook实体的Feed中显示帖子。该应用程序从Facebook Graph API获取其数据。

我使用Facebook JS SDK查询以下网址:/<entity-id>/feed?limit=20&fields=...

我有简单的分页按钮(“上一个”和“下一个”),它们分别在response.paging.previousresponse.paging.next中查询API响应中收到的分页网址。

问题是我不知道如何查明我是否在最后一页以正确禁用“下一步”按钮。

我尝试了几件事,但是我仍然没有得到我想要的东西。

选项1:允许点击“下一步”,直到没有更多数据作为回复

  • 按钮在response.data.length == 0时被禁用。

  • paging对象包含next网址,即使没有更多数据要接收,所以在进入没有数据的网页之前我无法检查它。

    < / LI>
  • 问题是,当我到达该页面时,paging中也没有response个对象。因此,我无法使用“上一页”按钮返回带有数据的最后一页。

选项2:允许点击“下一步”,直到我收到的数据少于查询限制

  • 按钮在response.data.length < limit时被禁用。

  • 适用于data.length % limit != 0

  • 的馆藏
  • 问题是相反的情况,例如当集合中有40个对象并且我在第二页上有限制20时,我仍然可以单击“下一步”,但后来我最终在页面上没有更多的对象,如选项1中所述。

选项3:记住上次请求的网址

  • 上次请求网址存储在变量中,即使paging中没有response数据,“上一页”按钮也会有效。

  • 只解决“你不能回头”的问题。

  • 通过正确禁用“下一步”按钮无法解决问题。仍然可以在包含数据的最后一页上单击“下一步”,然后转到没有数据的空白页面。

所以问题是:

如何才能发现我已经收到了收藏中的最后一项,点击“下一步”我会收到无效的空白页?

  • 即使在集合的开头/结尾,Graph API也提供response.paging网址,这似乎很奇怪。

  • 例如,如果我有10个帖子的Feed并且我使用limit 20进行查询,则会收到response data: Array[10]paging个对象,其中包含有效的网址paging.previouspaging.next,即使没有“上一个”也没有“下一个”数据。

  • 查询这些网址导致responsedata数组且没有paging对象,因此我无法返回无状态应用程序。

  • 如果集合开头没有paging.previous而集合结束时没有paging.next会不会更好?

2 个答案:

答案 0 :(得分:1)

通过Graph API基于游标的分页。 https://developers.facebook.com/docs/graph-api/using-graph-api#cursors

没有匹配的方法可以随心所欲地开箱即用。 您应该分别管理左侧记录和下一个按钮,分别是Graph API分页。 作为解决方案预加载下一页除了当前。

同样保存上一个光标是不好的做法: “不要存储游标。如果添加或删除项目,游标很快就会变得无效。”

答案 1 :(得分:1)

对于任何人看到这一点 - 这实际上是可行的。我不确定Graph分页对象以前是否总是返回上一个和下一个,或者OP是否在任何地方出错。但是,我可以确认,当数据能够像您预期的那样前进或后退时,它将正确返回上一个/下一个。

以下示例来自Graph API分页文档,并显示了该集合的第一页结果集。

"data": [
       *data returned*
],
"paging": {
  "cursors": {
    "before": "WTI5dGJXVnVkRjlqZAFhKemIzSTZANVGd3T1Rrek9UZAzROVGN3TlRNNE5Eb3hOVEV6TURnM09UTTIZD",
    "after": "WTI5dGJXVnVkRjlqZAFhKemIzSTZANVGd4TURBd09UazROVFk1T0RNM05Eb3hOVEV6TURreU5qQXoZD"
  },
  "next": "https://graph.intern.facebook.com/v2.11/1809938745705498/comments?access_token=valid_token_goes_here"
}

请注意,之前没有&#39;对象中的属性。仅检查下一个或上一个是否存在就足以让我继续禁用/隐藏按钮。