如何在查询 Facebook Graph API 时找出我在最后一页?
How to find out I'm on the last page when querying Facebook Graph API?
作为练习,我正在编写简单的(并且尽可能无状态)client-side 应用程序(在 React 中)在单个 Facebook 实体的提要中显示帖子。应用程序从 Facebook Graph API.
获取数据
我使用Facebook JS SDK查询如下URL:/<entity-id>/feed?limit=20&fields=...
我有简单的寻呼按钮("previous" 和 "next"),它们正在查询在 response.paging.previous
和 API 响应中收到的寻呼 URLs =13=]分别。
问题是我不知道如何确定我是否在最后一页以正确禁用"next"按钮。
我尝试了一些方法,但仍然没有得到我想要的。
选项 1:允许单击 "next",直到没有更多数据响应
按钮在 response.data.length == 0
时禁用。
paging
object 包含 next
URL 即使没有更多的数据要接收,所以我之前无法检查进入没有数据的页面。
问题是,当我到达该页面时,response
中也没有 paging
object。因此,我无法使用 "previous" 按钮返回到包含数据的最后一页。
选项 2:允许单击 "next",直到我收到的数据少于查询限制
按钮在 response.data.length < limit
时禁用。
适用于 collections,其中 data.length % limit != 0
.
问题恰恰相反,比如collection里有40个object,我在第二页限制20,我可以仍然单击 "next",但我最终进入的页面不再有 object,如选项 1 中所述。
选项 3:记住上次请求的 URL
上次请求 URL 存储到变量中,即使 response
中没有 paging
数据,"previous" 按钮也能正常工作。
只解决了"you can't go back"问题。
无法通过正确禁用 "next" 按钮来解决问题。还是有可能在最后一个有数据的页面点击"next",进入没有数据的空白页面
所以问题是:
我如何才能知道我已经收到了 collection 中的最后一项,并且通过单击 "next" 我将进入无效的空白页面?
Graph API 甚至在 collection 的 beginning/end 上提供 response.paging
URL 对我来说似乎很奇怪.
例如,如果我有 10 个帖子的 Feed 并且我使用 limit 20
查询,我会收到 response
data: Array[10]
和 paging
object 在 paging.previous
和 paging.next
中都具有有效的 URL,即使没有 "previous" 和 "next" 数据。
查询那些 URLs 结果 response
有空 data
数组,没有 paging
object,所以我在那里无法返回无状态应用程序。
如果collection开头没有paging.previous
,[=144=结尾没有paging.next
岂不是更好]?
按图 API 基于光标的分页。 https://developers.facebook.com/docs/graph-api/using-graph-api#cursors
没有匹配的方法可以随心所欲,开箱即用。
您应该管理左记录和下一个按钮,与 Graph API 分页分开。
作为解决方案预加载除当前页面之外的下一页。
同时保存以前的光标是不好的做法:
"Don't store cursors. Cursors can quickly become invalid if items are added or deleted."
对于看到此内容的任何人 - 这实际上是可行的。我不确定 Graph 分页对象以前是否总是 returned 上一个和下一个,或者 OP 是否在任何地方犯了错误。但是,我可以确认当数据能够按照您的预期前进或后退时,它会正确 return 和 previous/next。
以下示例来自 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"
}
请注意对象中缺少 'previous' 属性。仅检查是否存在下一个或上一个就足以让我继续使用 disable/hide 个按钮。
作为练习,我正在编写简单的(并且尽可能无状态)client-side 应用程序(在 React 中)在单个 Facebook 实体的提要中显示帖子。应用程序从 Facebook Graph API.
获取数据我使用Facebook JS SDK查询如下URL:/<entity-id>/feed?limit=20&fields=...
我有简单的寻呼按钮("previous" 和 "next"),它们正在查询在 response.paging.previous
和 API 响应中收到的寻呼 URLs =13=]分别。
问题是我不知道如何确定我是否在最后一页以正确禁用"next"按钮。
我尝试了一些方法,但仍然没有得到我想要的。
选项 1:允许单击 "next",直到没有更多数据响应
按钮在
response.data.length == 0
时禁用。paging
object 包含next
URL 即使没有更多的数据要接收,所以我之前无法检查进入没有数据的页面。问题是,当我到达该页面时,
response
中也没有paging
object。因此,我无法使用 "previous" 按钮返回到包含数据的最后一页。
选项 2:允许单击 "next",直到我收到的数据少于查询限制
按钮在
response.data.length < limit
时禁用。适用于 collections,其中
data.length % limit != 0
.问题恰恰相反,比如collection里有40个object,我在第二页限制20,我可以仍然单击 "next",但我最终进入的页面不再有 object,如选项 1 中所述。
选项 3:记住上次请求的 URL
上次请求 URL 存储到变量中,即使
response
中没有paging
数据,"previous" 按钮也能正常工作。只解决了"you can't go back"问题。
无法通过正确禁用 "next" 按钮来解决问题。还是有可能在最后一个有数据的页面点击"next",进入没有数据的空白页面
所以问题是:
我如何才能知道我已经收到了 collection 中的最后一项,并且通过单击 "next" 我将进入无效的空白页面?
Graph API 甚至在 collection 的 beginning/end 上提供
response.paging
URL 对我来说似乎很奇怪.例如,如果我有 10 个帖子的 Feed 并且我使用
limit 20
查询,我会收到response
data: Array[10]
和paging
object 在paging.previous
和paging.next
中都具有有效的 URL,即使没有 "previous" 和 "next" 数据。查询那些 URLs 结果
response
有空data
数组,没有paging
object,所以我在那里无法返回无状态应用程序。如果collection开头没有
paging.previous
,[=144=结尾没有paging.next
岂不是更好]?
按图 API 基于光标的分页。 https://developers.facebook.com/docs/graph-api/using-graph-api#cursors
没有匹配的方法可以随心所欲,开箱即用。 您应该管理左记录和下一个按钮,与 Graph API 分页分开。 作为解决方案预加载除当前页面之外的下一页。
同时保存以前的光标是不好的做法: "Don't store cursors. Cursors can quickly become invalid if items are added or deleted."
对于看到此内容的任何人 - 这实际上是可行的。我不确定 Graph 分页对象以前是否总是 returned 上一个和下一个,或者 OP 是否在任何地方犯了错误。但是,我可以确认当数据能够按照您的预期前进或后退时,它会正确 return 和 previous/next。
以下示例来自 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"
}
请注意对象中缺少 'previous' 属性。仅检查是否存在下一个或上一个就足以让我继续使用 disable/hide 个按钮。