gpt4 book ai didi

javascript - 如何正确使用forkJoin

转载 作者:行者123 更新时间:2023-12-03 00:49:05 26 4
gpt4 key购买 nike

我对内部可观察对象有疑问。

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 的东西,但不知道如何正确使用它。有什么帮助吗?

最佳答案

如果我正确理解您的问题,这些可能是一些解决方案的建议。

为了让事情变得更清晰,至少对我来说,我将开始创建一个函数,它需要一个 categoryId 作为输入并返回该类别的 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 压平 words 数组并创建一个Observable 发出数组的每个元素。
  • 在第二个运算符 map 中,您开始创建一个 Observables 数组,它表示从 categoryId 开始获取 category 的请求,然后返回一个包含 word 内容的对象(我假设类型 Word 有一个属性 word ,其中包含实际单词)和相关的类别请求
  • 然后我需要使用 forkJoin 来执行请求,因此我使用 mergeMap 将之前的 map 运算符返回的对象转换为一个 Observable,当将某个 wordcategoryIds 转换为 categories 的所有请求均已完成时发出
  • forkJoin 之后的 pipe 只是创建具有 wordcategories 属性的对象

由于我没有现成的 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])
}

关于javascript - 如何正确使用forkJoin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53129267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com