Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RXJS行为主体在第一次加载时输出重复项_Javascript_Angular_Ionic2_Rxjs - Fatal编程技术网

Javascript RXJS行为主体在第一次加载时输出重复项

Javascript RXJS行为主体在第一次加载时输出重复项,javascript,angular,ionic2,rxjs,Javascript,Angular,Ionic2,Rxjs,我正在构建一个Ionic 2应用程序,当应用程序加载时,它应该会显示您附近的用户,这很有效,但它会显示重复的值,我知道这可能是行为主体行为的一部分,因为它会显示初始值,然后显示接下来的值?是否有一种方法可以在全部加载后显示值。。在我的头脑中,它应该像一个数组一样工作,然后填充,只有到那时它才会显示,或者在填充时弹出条目 下面是my Service.ts,它使用next将用户推送到组件 import { Injectable, NgZone } from '@angular/core'; impo

我正在构建一个Ionic 2应用程序,当应用程序加载时,它应该会显示您附近的用户,这很有效,但它会显示重复的值,我知道这可能是行为主体行为的一部分,因为它会显示初始值,然后显示接下来的值?是否有一种方法可以在全部加载后显示值。。在我的头脑中,它应该像一个数组一样工作,然后填充,只有到那时它才会显示,或者在填充时弹出条目

下面是my Service.ts,它使用next将用户推送到组件

import { Injectable, NgZone } from '@angular/core';
import { Geolocation, Geoposition, BackgroundGeolocation } from 'ionic-native';
import { Fb } from './firebase';
import { Observable } from 'rxjs/Observable';
import {Subject} from 'rxjs/Subject';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import { User } from './user';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/share';
import 'rxjs/add/operator/map';
import 'rxjs/Rx';

declare var GeoFire: any


@Injectable()
export class LocationTracker {

public firebaseRef: any;
public geoFire: any;
public subject: Subject<any> = new BehaviorSubject(0);

constructor( public zone: NgZone, public fire:Fb, public user:User) {
    this.firebaseRef = this.fb.ref('geofire');
    this.geoFire     = new GeoFire(this.firebaseRef);
}

UsersNearME() : Observable<any> {
    this.nearme.length = 0;
    let geoQuery = this.geoFire.query({
    center: [this.lat, this.lng],
    radius: 4.609 //kilometers
    });
    geoQuery.on("key_entered", (key, location, distance) => {

const sender = this.fb.ref('/users/'+ key  );
    sender.on('value',  (snapshot) => {
        const profile = snapshot.val().profile;
        this.nearme.push({ 
            userid: key,
            userloc: location,
        });
        this.subject.next(this.nearme);
        // 
    }); 
    });
return this.subject.asObservable();
}
}

这就是
BehaviorSubject
的作用,它首先给出存在的值,然后给出所有下一个值。如果不需要第一个值,则将其更改为简单的
Subject

public subject: Subject<any> = new Subject();
据我所知,这段代码使用新值递增数组,并希望将整个数组再次显示给订阅者?如果没有,

    this.subject.next({ 
        userid: key,
        userloc: location,
    });

这就是
BehaviorSubject
的作用,它首先给出存在的值,然后给出所有下一个值。如果不需要第一个值,则将其更改为简单的
Subject

public subject: Subject<any> = new Subject();
据我所知,这段代码使用新值递增数组,并希望将整个数组再次显示给订阅者?如果没有,

    this.subject.next({ 
        userid: key,
        userloc: location,
    });

那我就拿不到最后一个了value@REPTILE你看过缓冲区长度为1的replaysubject吗?没有,但我现在会在那里尝试,我仍然得到dupesThanks的帮助,但不幸的是,这会使结果成倍增加,然后我无法得到最后一个value@REPTILE你看过缓冲区长度为1的replaysubject吗?没有,但我会的现在在那里尝试过,我仍然得到DupesHanks的帮助,但不幸的是,这会使结果成倍增加。问题似乎在于如何创建
this.nearme
数组。您将用户推到它,然后发射。按下另一个值,然后发射。检索所有附近的用户然后发出一次数组不是更好吗?看起来问题在于如何创建
this.nearme
数组。您将用户推到它,然后发射。按下另一个值,然后发射。检索所有附近的用户,然后发射一次阵列不是更好吗?