Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.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 AsyncSubject-如何只获取一次数据?_Javascript_Angular_Rxjs_Observable - Fatal编程技术网

Javascript AsyncSubject-如何只获取一次数据?

Javascript AsyncSubject-如何只获取一次数据?,javascript,angular,rxjs,observable,Javascript,Angular,Rxjs,Observable,在Angular4中使用Rxjs的问题关注点 RxJS版本: 5.5.0 要复制的代码: 服务 主题=新的AsyncSubject(); 主题。下一步(数据); subject.complete() 组成部分 ngOnInit(){ subject.subscribe(); } 预期行为: 只接收一次数据,然后清除subject中的数据,使其不再接收一次或强制取消订阅subject 实际行为: 在服务中,我有一个asyncSubject,它发出一些数据。在我订阅asyncSubject的某些

在Angular4中使用Rxjs的问题关注点

RxJS版本: 5.5.0

要复制的代码: 服务

主题=新的AsyncSubject();
主题。下一步(数据);
subject.complete()

组成部分

ngOnInit(){
subject.subscribe();
}

预期行为: 只接收一次数据,然后清除subject中的数据,使其不再接收一次或强制取消订阅subject

实际行为: 在服务中,我有一个asyncSubject,它发出一些数据。在我订阅asyncSubject的某些组件中,每次组件初始化都会有数据。我尝试取消订阅主题,但在下一个组件初始化之后,它再次订阅

其他信息: 角度版本4.4.6 Chrome版本61

仪表板组件

constructor(private userEvents: UserEvents,) {}

ngOnInit() {
    this.successLogged();
}


successLogged() {
    this.userEvents.successLoggedObservable.subscribe(message => {
        console.log("WORK");
    });
}
private  successLoggedObservable = new AsyncSubject<String>();
get successLogged() {
    return this.successLoggedObservable;
}
this.userEvents.successLoggedObservable.next("MESSAGE");
this.userEvents.successLogged.complete();
this.stateService.go('dashboard');
用户事件

constructor(private userEvents: UserEvents,) {}

ngOnInit() {
    this.successLogged();
}


successLogged() {
    this.userEvents.successLoggedObservable.subscribe(message => {
        console.log("WORK");
    });
}
private  successLoggedObservable = new AsyncSubject<String>();
get successLogged() {
    return this.successLoggedObservable;
}
this.userEvents.successLoggedObservable.next("MESSAGE");
this.userEvents.successLogged.complete();
this.stateService.go('dashboard');

这是
AsyncSubject
ngOnInit()
的正常行为。无论何时订阅
AsyncSubject
,它都会发出最后一个发出的值,因此每次组件初始化时,它都会收到最后一个发出的值。如果要避免这种情况,请使用常规的
Subject
(或
PublishSubject


来自官方文档的信息:

在每次加载时调用ngOnInit是一种常见行为。您可以创建bool变量,如果它已经加载,则指定false值

subscribed: Boolean = false;

ngOnInit() {
  if (!subscribed) {
    subject.subscribe();
    this.subscribed = true;
  }
}
使用组件中的
publish()
connect()
尝试
ReplaySubject(1)

// Service
const source = new Rx.ReplaySubject(1).publish()
source.next(1)
// source.complete() - not needed


// Simulate first subscribing component 
const sub1 = source.subscribe(x => console.log('sub1', x))
source.connect()

// onDestroy
sub1.unsubscribe()


// Now resubscribe
const sub2 = source.subscribe(x => console.log('sub2', x))
source.connect()
// No value emitted
工作示例:

本质上,
publish()
connect()
使可观察到的内容变得热门,因此新订阅在订阅点接收流


AsyncSubject不起作用,但我还没有弄清楚原因。

Subject不起作用。当我转到我的组件A时,我订阅Subject Observable,然后转到组件B,在组件B中调用next方法,然后返回A,一切正常(调用subscriber)。但当我第一次转到组件B和下一个组件A时,订阅服务器不起作用。你不能指望我在没有看到你的代码的情况下帮助你。它不起作用。我每次加载组件时,订阅服务器的值都为false,订阅服务器的值为invoke。所以让我正确地说,你想触发一个事件,然后从登录导航到仪表板并接收event在那里?您必须使用
Async
Replay
主题并修复您的用例,或者使用另一种组件通信形式,例如
路由器参数
。您在这里的逻辑毫无意义。我想在登录我的LoginComponent后将登录成功消息传递给仪表板组件。您有任何id吗ea我怎样才能到达它?正如我所说的,如果你使用路由器导航到你的仪表板组件,你可以使用路由器参数向它发送数据。我使用路由参数解决它。谢谢!