javascript - 如何正确使用forkJoin
问题描述
我对内部 Observables 有疑问。
const wordsCollection = this.db.collection('words').valueChanges();
return wordsCollection.pipe(
map((words: Word[]) => {
return words.map((word: Word) => {
const categories = word.categories.map((categoryId: string) => {
return this.db.collection('categories').doc(categoryId).valueChanges().pipe(
map((category: Category) => {
return category;
})
);
});
return {
...word,
categories: categories
};
});
})
);
结果是这样的:
{
word: 'blabla',
categories: Observable (instead of for example 'english')
}
我知道我需要使用类似 forJoin 的东西,但不知道如何正确使用它。有什么帮助吗?
解决方案
如果我正确理解您的问题,这些可能是一些解决方案的建议。
为了让事情稍微清楚一点,至少对我来说,我将开始创建一个函数,它期望 acategoryId
作为输入并返回该类别的 Observable,即类似于
function getCategory(categoryId: number) {
return this.db.collection('categories').doc(categoryId).valueChanges();
}
然后我会像这样构建我需要的 Observable
wordsCollection.pipe(
mergeMap(words => words),
map(word => {
const categoryRequests = word.categories.map(categoryId => getCategory(categoryId));
return {word: word.word, categoryRequests};
}),
mergeMap(({word, categoryRequests}) => forkJoin(categoryRequests).pipe(map(categories => ({word, categories}))))
)
这里的关键点如下
- 第一个
mergeMap
将 Array 展平words
并创建一个 Observable,该 Observable 发出 Array 的每个元素。 - 在第二个运算符 中,您开始创建一个 Observables 数组,它表示从其
map
获取开始的请求,然后返回一个对象,该对象同时具有(我假设该类型具有包含实际word) 和相关的类别请求category
categoryId
word
Word
word
- 然后我需要用来
forkJoin
执行请求,因此我用来mergeMap
将前一个运算符返回的对象转换map
为一个 Observable,当所有要转换为某个特定的请求categoryIds
都categories
完成word
时发出 - 之后
pipe
只是forkJoin
用word
和categories
属性创建对象
由于我没有现成的 Firebase 环境,因此我使用以下代码模拟了 Firebase Observables
const words = [
{word: 'abc', categories: [1, 2, 3]},
{word: 'cde', categories: [3, 4, 5]},
];
const categories = {
1: 'X',
2: 'Y',
3: 'Z',
4: 'X',
5: 'W',
}
function getCategory(categoryId: number) {
return of(categories[categoryId])
}
推荐阅读
- java - 将文件附加到进程时出错
- curl - 我们应该在文档中使用 Curl 还是 cURL?
- java - Java Android WebRTC提供创建抛出错误和Ice Gathering或trickling没有发生
- azure - 如何使用 Powershell 从我的本地计算机在 Azure Windows 虚拟机 (VM) 中运行“sysprep /generalize”?
- angular - 对服务中的 BehaviorSubject 进行单元测试
- php - 仅从 php 中的最后一个字符串中删除最后一个数字
- swift - CGContext 中的多种混合模式
- monads - 用纯编程语言包装副作用
- c# - EmguCV Video Writer - 确保您安装了特定的编解码器
- if-statement - 复杂的 IF 语句返回 false