RxJava 和基于游标的 RESTful 分页

2023-12-27

我正在使用 Spotify API,并希望使用 RxJava 链接一些分页结果。 Spotify 使用基于光标的分页,因此解决方案如下来自@lopar 的一个 https://stackoverflow.com/a/29594194/377260不管用。

回复来自这个电话 https://developer.spotify.com/web-api/get-followed-artists/看起来像这样(想象一下有 50 个items):

{
  "artists" : {
    "items" : [ {
      "id" : "6liAMWkVf5LH7YR9yfFy1Y",
      "name" : "Portishead",
      "type" : "artist"
    }],
    "next" : "https://api.spotify.com/v1/me/following?type=artist&after=6liAMWkVf5LH7YR9yfFy1Y&limit=50",
    "total" : 119,
    "cursors" : {
      "after" : "6liAMWkVf5LH7YR9yfFy1Y"
    },
    "limit" : 50,
    "href" : "https://api.spotify.com/v1/me/following?type=artist&limit=50"
  }
}

现在,我使用改造得到了前 50 个这样的结果:

public class CursorPager<T> {
    public String href;
    public List<T> items;
    public int limit;
    public String next;
    public Cursor cursors;
    public int total;

    public CursorPager() {
    }
}

public class ArtistsCursorPager {
    public CursorPager<Artist> artists;

    public ArtistsCursorPager() {
    }
}

then

public interface SpotifyService  {

    @GET("/me/following?type=artist")
    Observable<ArtistsCursorPager> getFollowedArtists(@Query("limit") int limit);

    @GET("/me/following?type=artist")
    Observable<ArtistsCursorPager> getFollowedArtists(@Query("limit") int limit, @Query("after") String spotifyId);

}

and

mSpotifyService.getFollowedArtists(50)
        .flatMap(result -> Observable.from(result.artists.items))
        .flatMap(this::responseToArtist)
        .sorted()
        .toList()
        .subscribe(new Subscriber<List<Artist>>() {
            @Override
            public void onNext(List<Artist> artists) {
                callback.onSuccess(artists);
            }
            // ...
        });

我想返回所有(在本例中为 119)艺术家callback.success(List<Artist>)。我是 RxJava 新手,所以我不确定是否有smart方法来做到这一点。


递归解决方案的唯一问题是堆栈溢出问题。一种无需递归的方法是

Observable<ArtistsCursorPager> allPages = Observable.defer(() ->
{
    BehaviorSubject<Object> pagecontrol = BehaviorSubject.create("start");
    Observable<ArtistsCursorPager> ret = pageControl.asObservable().concatMap(aKey ->
    {
        if (aKey != null && aKey.equals("start")) {
            return Observable.getFollowedArtists(50).doOnNext(page -> pagecontrol.onNext(page.cursors.after));
        } else if (aKey != null && !aKey.equals("")) {
            return Observable.getFollowedArtists(50,aKey).doOnNext(page -> pagecontrol.onNext(page.cursors.after));
        } else {
            return Observable.<ArtistsCursorPager>empty().doOnCompleted(()->pagecontrol.onCompleted());
        }        
    });
    return ret;
});

查看解决方案这个问题 https://stackoverflow.com/questions/37326380/paginate-observable-results-without-recursion-rxjava.

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

RxJava 和基于游标的 RESTful 分页 的相关文章

随机推荐

  • 安装 Ionic2 应用程序所需的类型

    所以我正在研究 Ionice2 项目 这仍然是新项目 差不多一周了 并且我正在尝试按照下面的教程使用 PouchDB 进行 LocalStorage 教程 http gonehybrid com how to use pouchdb sql
  • UITableView、UIWebViews 和scrollsToTop 属性 = 麻烦

    我的应用程序有一个UITableView UITableView 有一个标题视图 它是UIWebView 默认情况下 滚动视图有其scrollsToTop属性设置为YES 这将使用户能够点击状态栏滚动到滚动视图的顶部 当一个视图中嵌入两个滚
  • 使用类类型向量进行前向声明 - 不允许指向不完整类类型的指针

    我有两节课 foo and bar foo h includes bar h 并包含一个std vector的指针bar对象 在运行时的某个时刻 bar必须访问这个指向其他指针的向量bar对象 所以 foo包含一个名为getBarObjec
  • 如何使用 System.Windows.Shapes.Path 绘制圆的一部分?

    我有一个 Silverlight 应用程序 通过实例化 System Windows Shapes Line 的实例然后将其添加到 MainCanvas Children 来在图片上绘制线条 我想同样添加一些圆段 如果我理解正确 我会想使用
  • PyTorch 自定义转发功能不适用于 DataParallel

    编辑 我尝试过 PyTorch 1 6 0 和 1 7 1 都给了我同样的错误 我有一个模型 允许用户轻松地在不同架构 A 和 B 之间切换 两种架构的前向函数也不同 所以我有以下模型类 附 我在这里只是用一个非常简单的例子来演示我的问题
  • 如何封装数据库访问?

    我正在 NET 中开发一个事务应用程序 希望获得一些有关如何正确封装数据库访问的信息 以便 我没有所有连接字符串 在那个地方 对同一个存储的多次调用 来自不同功能的过程 或者更糟糕的是 多个存储 程序不同 单列 我有兴趣知道使用像 NHib
  • python中的子串比较

    如果我有列表 PhoneDirectory 例如 John 009878788677 Jefrey 67654654645 Maria 8787677766 该函数可用于比较 List 中每个条目中是否存在子字符串 例如 Joh 我尝试过使
  • 卡夫卡生产者在第一条消息上速度很慢

    我在 NET 中有一个测试应用程序 它创建 kafka 生产者并使用 Confluence 客户端库向主题发送一些消息 由于某种原因 第一条消息的确认总是晚 1 秒到达 后续消息的确认几乎立即到达 这是正常行为还是我缺少某些配置 我想我尝试
  • git:更好的 git 恢复方法,无需额外恢复提交

    我在远程 本地分支中有一个提交 我想将该提交从历史记录中删除 并将其中一些放入自己的分支中 基本上 现在我有 D E F G master 而且我要 E G topic D master 这应该在我的本地和 只有一个 称为 origin 远
  • 具有 Http 触发功能的连续 Azure WebJob

    我目前有一个天蓝色的网络作业 每天执行从一个数据库到另一个数据库的同步 但也想添加手动触发同步的功能 我在webjob项目中设置的功能如下 public static void SyncData TimerTrigger 0 0 5 Run
  • 使用 Android 版 Facebook SDK 3.0 检索个人资料图片

    我遇到了适用于 Android 的 Facebook SDK 3 0 的问题 我想在不使用 ProfilePictureView 小部件的情况下获取我 和我的朋友 的个人资料图片 所以如果我使用 Graph Explorer 我会看到 Js
  • 无法序列化数据表。未设置数据表名称

    我需要将所有数据表导出到单独的 XML 文件 但如果有一个巨大的表 我无法一次导出所有行 因为会出现 System OutOfMemoryException 所以我尝试导出N行 但是 如果我在查询中使用分页语法 WriteXml 会引发异常
  • 在 Shiny App 中使用下载的/外部文件

    我正在尝试创建一个闪亮的应用程序 它使用谷歌电子表格中外部可用的信息 我将其下载到临时 csv 文件中 该应用程序在我的本地计算机上运行正常 但是当我尝试将其推送到闪亮应用程序io http shinyapps io应用程序失败 我尝试使用
  • Elixir 是否支持内省以显示可用功能?

    考虑这个片段凤凰编程 https pragprog com book phoenix programming phoenix defmodule Rumbl VideoController do use Rumbl Web controll
  • DirectX11 使用 PNG CreateWICTextureFromMemory

    我目前已经使用 CreateWICTextureFromFile 加载纹理 但是我想要对其进行更多控制 并且我想将图像以字节形式存储在资源加载器中 下面只是两组测试代码 它们返回两个单独的结果 我正在寻找对可能的解决方案的任何见解 ID3D
  • C++0x线程中断

    根据 C 0x 最终草案 无法请求线程终止 也就是说 如果需要 我们需要实施一个 DIY 解决方案 另一方面 boost thread 提供了一种中断线程的机制 safe方式 您认为最好的解决方案是什么 设计自己的协作 中断机制 还是采用本
  • pydev:查找对函数的所有引用

    以前可能有人问过这个问题 但我似乎找不到答案 我已经从 Windows 迁移到 Linux 并最近开始使用 PyDev Aptana 但我似乎找不到如何找到对函数的所有引用 Ctrl Shift G 将查找 PyDev 中对函数的所有引用
  • API 平台 - UI 服务器端点定义

    有人可以帮忙吗API平台用户界面 在文档中 我无法找到定义服务器的方法 我希望服务器端点输出显示是否开启本地主机 dev or prod 有人可以帮忙解决这个问题吗 我在 Symfony 中使用它 我不确定它是否与路由文件夹中的 api p
  • 让 TeamCity 拉下所有 git 分支

    在构建服务器上 我设置了 TeamCity 8 1 1 以便在主分支 功能分支之一或使用分支说明符的拉取请求分支之一发生更改时执行构建过程 refs heads refs pull merge 我已经打开了构建代理选项 teamcity g
  • RxJava 和基于游标的 RESTful 分页

    我正在使用 Spotify API 并希望使用 RxJava 链接一些分页结果 Spotify 使用基于光标的分页 因此解决方案如下来自 lopar 的一个 https stackoverflow com a 29594194 377260