Javascript 如何减少amap Array.prototype.some()调用?
我有一个服务管理从SocketioAPI获取的数据,比如Javascript 如何减少amap Array.prototype.some()调用?,javascript,angular,typescript,optimization,rxjs,Javascript,Angular,Typescript,Optimization,Rxjs,我有一个服务管理从SocketioAPI获取的数据,比如 export class DataService { private data: SomeData[]; // ... getData(): Observable<SomeData[]> { // distinctUntilChanged was used to limit Observable to only emits when data changes // but it does n
export class DataService {
private data: SomeData[];
// ...
getData(): Observable<SomeData[]> {
// distinctUntilChanged was used to limit Observable to only emits when data changes
// but it does not seem to change much things...
return this.data.pipe(distinctUntilChanged());
}
// ...
}
问题是,每次发出combinelatetest
中处理的一个可观测值时,我都要调用Array.prototype.some()
函数。我不想这样
如何优化此代码,使我不经常调用
some
?有关distinctunitrichanged()
运算符的一点需要注意的是,它只影响订阅。因此,源可观测对象和订阅之间的操作符仍然在运行。作为解决办法,您可以手动检查两次排放之间的数据是否发生了变化。试试下面的方法
让oldData:any;
此.banana$=CombineTest([
SomefNotRequestNetworkObject(),
DataService.getData()
]).烟斗(
地图([网络,数据])=>{
如果(!oldData | | oldData!==数据){
oldData=数据;
返回(network&&data.some(_data=>_data.ip===network.ip));
}
return false;//我认为你关于distinctUntilChanged
不工作的预感是正确的。
默认情况下,此运算符使用相等检查来确定两个值是否相同。
但是,如果要比较的对象不是简单的标量值(如数字或布尔值),则(在大多数情况下)这将无法正常工作
事实证明,作为distinctUntilChanged
的第一个参数。
这将在“连续”元素上调用,以确定新元素是否与最近的元素不同
此比较器函数的确切定义取决于SomeData
类/接口的外观,以及SomeData
居民数组与另一个居民数组相同的含义。
但是,作为一个例子,让我们假设SomeData
如下所示:
interface SomeData {
id: string;
name: string;
age: number;
}
如果居民拥有相同的id
,那么SomeData
居民就是相同的。
此外,假设两个SomeData
s数组包含完全相同的SomeData
元素,则它们是相同的。
那么,我们的比较器函数可能如下所示:
function eqSomeDataArrays(sds1: SomeData[], sds2: SomeData[]): boolean {
// Two arrays of `SomeData` inhabitants are the same if...
// ...they contain the same number of elements...
return sds1.length === sds2.length
// ...which are "element-wise", the same (i.e. have the same `id`)
&& sds1.every((sd1, i) => sd1.id === sds2[i].id)
}
getData(): Observable<SomeData[]> {
return this.data.pipe(distinctUntilChanged(eqSomeDataArrays));
}
要将其全部结束,您的getData
方法现在看起来如下所示:
function eqSomeDataArrays(sds1: SomeData[], sds2: SomeData[]): boolean {
// Two arrays of `SomeData` inhabitants are the same if...
// ...they contain the same number of elements...
return sds1.length === sds2.length
// ...which are "element-wise", the same (i.e. have the same `id`)
&& sds1.every((sd1, i) => sd1.id === sds2[i].id)
}
getData(): Observable<SomeData[]> {
return this.data.pipe(distinctUntilChanged(eqSomeDataArrays));
}
getData():可观察{
返回这个.data.pipe(distinctUntilChanged(eqSomeDataArrays));
}
在管道中,在映射调用之后,您可以使用shareReplay(1)
如果确实需要每次调用它,combinelateest
不是正确的运算符或者您希望使用什么?