我正在尝试使用TypeScript和rxjs构建无限滚动列表.也就是说,我希望应用程序从后端获取几页结果,然后在用户滚动到底部附近时获取更多结果.
我有一个Observable,用Observable.prototype.expand()它构建,它将给我所有结果,最终从服务器获取所有页面.但是由于Observable的性质,我不能暂停这个过程.一旦我订阅它将不可避免地尽快获取所有结果.我需要一个不同的解决方案,我可以以我需要的速度从结果流中提取.
由于我无法直接从API获取第二页,每个页面都包含我需要获取下一页的信息,事情变得更加复杂.回复如下:
interface GraphApiResponse {
data?: any[];
paging?: {
cursors: {
before: string,
after: string
},
next?: string,
previous?: string
};
}
Run Code Online (Sandbox Code Playgroud)
的存在paging.next表明还有另外一个页面,并paging.cursors.after用于实际检索.
我似乎无法弄清楚如何实现这一点,而不会让它变得混乱.然而,无限列表似乎是一个普遍的问题,它不太可能没有一个好的解决方案.我应该如何实现这一点,而不是把事情搞得一团糟?
我的第一个想法是使用Iterable of Promises,但是我不知道会得到多少结果,迫使我建立一个无限的,Iterable<Promise<Response?>>其Promise将undefined在某一点之后解决.然而,由于它是无限的,我不能正常迭代(它将用Promises填充整个可用内存),实际上当它们处于该形式时使用结果意味着在前一个的解析函数中获取每个Promise.
这个解决方案看起来可能有用,但是我写的每一行都变得不那么容易阅读和复杂了.
在谷歌搜索问题时,我发现了一个相关的SO问题以及关于rxjs背压的GitHub问题,两者都包含Ben Lesh的代码片段,显然可以用来向Observable添加背压,遗憾的是,无论我尝试什么,我无法获取源Observable发出它的值比生成它们的速度慢,它们总是只是在某处缓冲,这意味着无论如何都会发生网络请求.
来自GitHub:
// this behavior subject is basically your "give me the next batch" mechanism.
// in this example, we're going to make 5 async requests back to back before requesting more.
const …Run Code Online (Sandbox Code Playgroud) 我在 Linux 系统 (Ubuntu) 上运行 Perl 时遇到问题:
user@Box:~$ perl -e exit
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "en_US:en",
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LANG = "en_DK.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_DK.UTF-8").
Run Code Online (Sandbox Code Playgroud)
谷歌搜索表明,这通常与引用缺失语言环境的环境变量有关,但是所有语言环境似乎都在那里:
user@Box:~$ locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
C
en_DK.utf8
en_GB.utf8
en_US
en_US.iso88591
en_US.utf8
POSIX
Run Code Online (Sandbox Code Playgroud)
我已经尝试安装所有的 en,但这似乎没有任何影响。