【发布时间】:2020-06-11 01:41:12
【问题描述】:
RxJS (^6.5.5) 的新手,我对 groupBy 运算符有疑问。下面是一个精简的例子。
我有一个函数retrieveFiles(),它返回一个字符串数组。
function async retrieveFiles(): Promise<string[]> {
return ['file1.txt', 'file2.txt', 'file3.txt', 'directory1', 'directory2'];
}
实际上,这会从远程源获取一组数据。
假设我想按前 4 个字符对文件名进行分组。
使用RxJS我可以这样做。
of(retrieveFiles()).pipe(
concatMap(v => v),
mergeMap(value => value),
groupBy(
(name: string) => name.substr(0, 4),
(name: string) => name,
),
mergeMap(group$ => group$.pipe(toArray())),
)
.subscribe(console.log);
这将向订阅者发出两个值。
[ 'file1.txt', 'file2.txt', 'file3.txt' ]
[ 'directory1', 'directory2' ]
现在让我们引入timer 并稍微修改一下代码。我们现在基本上是在投票。
timer(0, 1000)
.pipe(
concatMap(() => this.retrieveFiles()),
mergeMap(value => value),
groupBy(
(name: string) => name.substr(0, 4),
(name: string) => name,
),
mergeMap(group$ => group$.pipe(toArray())),
)
.subscribe(console.log);
这不再发出任何值。这两者有什么区别?
【问题讨论】:
-
如果
of(retrieveFiles())是Observable<string[]>类型,则此代码中有错误concatMap(v => v),无效,它应该是Observable<Promise<string[]>>吗?mergeMap(value => value),部分在这两种情况下都是无效的。 -
为什么
retrieveFiles需要返回一个 Observable?of不应该为我创建那个 Observable 吗? -
of创建可观察到的 yes,这就是为什么of(retrieveFiles())的类型将是Observable<Promise<string[]>> -
我弄错了,我忘记了 rxjs 让你在新版本中使用数组和 Promise 玩起来更快更松
-
版本 6.5.5 在这个特定的例子中,我会在问题中提到。谢谢。
标签: typescript rxjs