我正在輸入一個 observable,它會傳輸一系列食物。我需要最新的廚師、最新的廚房和用于準備這些食物的最新刀具。這三個值都是通過像 getCookById(food.cook.id) 這樣的 observable 得到的值。我怎么能這樣映射:
- 我在等待各種食物
- 當我收到它時,我會在每個食物專案上映射到:
- 獲取來自 Observables 的最新廚師、廚房和刀具(combineLatest?)
- 將所有這些組合在一個物件上,例如
{
foodItem,
cook,
kitchen,
knife
}
- 回傳所有這些轉換項的陣列
目前,我得到了一組空專案,如下所示:
const foodObservable = new Subject();
foodObservable.pipe(
map(foodItems => {
return foodItems.map((foodItem: any)=>{
const cookObservable = new Subject();
const kitchenObservable = new Subject();
const knifeObservable = new Subject();
combineLatest(cookObservable, kitchenObservable, knifeObservable).subscribe(([cook, kitchen, knife]) => {
return {
foodItem,
cook,
kitchen,
knife
};
});
})
})
).subscribe(foodPreparationArray=>{
console.log(foodPreparationArray) // array of empty values :(
})
uj5u.com熱心網友回復:
根據您的情況和您的評論,我建議進行以下更改
您需要使用更高階的映射運算子,例如
switchMap從一個可觀察物件映射到另一個可觀察物件。map運算子用于轉換發出的資料。使用 Firebase
get()而不是valueChanges()更合適。我假設您目前需要該值并且不需要觀察該屬性的任何更改。請參閱此處了解更多資訊。使用
get()而不是valueChanges()為我們提供完成而不是流式傳輸的可觀察物件。所以,你可以替換combineLatest使用forkJoin。你需要兩個
forkJoins。首先forkJoin是為每個元件的觸發請求foodItems陣列和第二forkJoin是提供一種用于觸發請求cook,knife和kitchen同時進行。最后,您可以使用
map運算子來組合所有內容。
嘗試以下
foodObservable.pipe(
switchMap((foodItems: any) => // <-- RxJS `switchMap` operator
forkJoin(
foodItems.map((foodItem: any) => // <-- JS `Array#map` function
forkJoin({
cook: db.collection('cook').doc(foodItem.cookId).get(),
kitchen: db.collection('kitchen').doc(foodItem.kitchenId).get(),
knife: db.collection('knife').doc(foodItem.knifeId).get()
}).pipe(
map(({cook, kitchen, knife}) => ({ // <-- RxJS `map` operator
...foodItem, // <-- spread operator
cook: cook,
kitchen: kitchen,
knife: knife
)})
)
)
)
)
).subscribe({
next: (foodPreparationArray: any) => {
console.log(foodPreparationArray);
},
error: (error: any) => {
// handle error
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/361211.html
標籤:javascript 有角的 打字稿 rxjs 可观察的
