如何正确将数组插入到rxjs主题

时间:2019-10-23 08:23:10

标签: angular typescript rxjs

当我将数组插入rxjs主题时,我得到的数组是相同数组的3倍。

父组件:

    const geoExistsArr: { lat: number, lng: number }[] = [];
    for (let i = 0; i < x.length; i++) {
        for (let j = 0; j < requiredKeys.length; j++) {
            // Some logic
        }
        if (has(x[i].data, 'lat') && has(x[i].data, 'lng')) {
            // Pushing to array
            const { lat, lng } = x[i].data;
            geoExistsArr.push({ lat, lng })
        }
    }
    console.log(geoExistsArr)
    // Adding the array to subj.
    this.locationSrv.setLocations(geoExistsArr)

服务:

setLocations(loc: ILocation) {
    this.geoArray = [...this.geoArray, loc]
    this.geoSubj$.next(this.geoArray)
}

子组件(显示主题的值):

    this.geoLocation$ = this.locationSrv.geoCoordinates$.pipe(
        switchMap((geo, idx) => {
            console.log(geo, idx) // <- problem here. this guy prints 3 times.
            geo.forEach(g => {
                console.log(g)
                requests.push(this.locationSrv.getAddressByLatLng$(g))
            });
            return concat(...requests).pipe(
                toArray()
            )
        }),

会发生什么: 我将单个数组存储到主题。

我对这个错误一无所知,因此我们将不胜感激!

1 个答案:

答案 0 :(得分:0)

好的,我承认伊玛驴。在我的子组件内部,我正在运行一个*ngFor循环,而我解开geolocations$ | async的模板就在那个循环内。 @Andrew Allen建议查看调用主题的next()函数的次数,但是对于阅读此主题的任何人,请检查您的模板可观察对象是否在html中的某个位置被多次包装。谢谢!