RXJS组合最新运行管道7次为一个发射



我写了一个函数来组合两个firestore集合可观察对象,它工作得很好,但是它运行了7次map函数,只有一个结果。是我在这里做错了什么,还是有一种方法可以减少正在完成的处理量?

return combineLatest(
[
this.approvedToppings$,
this.myPendingToppings$
],
).pipe(
map(([approved, pending], index) => {
console.log(index);
//console.log(pending);
let toppingDocs = approved.concat(pending);
//console.log(toppingDocs);
let toppings: Topping[] = [];
toppingDocs.forEach((toppingDoc) => {
toppings.push(this.convertToppingDocToTopping(toppingDoc));
});
return toppings as Topping[];
})
);
}

每次更新时,地图顶部的console.log运行7次,这对我来说没有任何意义。

如果您希望combinellatest只工作一次,您可以尝试使用take(1), distinctUntilChanged(),像这样;

return combineLatest(
[
this.approvedToppings$,
this.myPendingToppings$
],
).pipe(
take(1), // Add this line &&
distinctUntilChanged(), // Add this line too
map(([approved, pending], index) => {
console.log(index);
//console.log(pending);
let toppingDocs = approved.concat(pending);
//console.log(toppingDocs);
let toppings: Topping[] = [];
toppingDocs.forEach((toppingDoc) => {
toppings.push(this.convertToppingDocToTopping(toppingDoc));
});
return toppings as Topping[];
})
);
}

Combine latest仅在它拥有所有依赖项的值时才会发出。然后,当它的任何依赖项再次发出时,它会再次发出每个的最新值。

如果这些依赖项只发出一次,那么我认为你可能在控制台中有7个日志的原因是因为你有多个订阅者到这个可观察对象。

可观察对象默认是冷的。也就是说,如果你有多个可观察对象的订阅,这个可观察对象会被创建很多次。如果使用shareereplay会发生什么?:

return combineLatest(
[
this.approvedToppings$,
this.myPendingToppings$
],
).pipe(
...,
shareReplay(1)
);
}

如果你只想从每个依赖项中获得第一个值,那么在每个依赖项上应用take(1)

相关内容

最新更新