我不明白!
这就是我想要的。我在api服务器上运行一个模型,需要大约5-10分钟才能运行。因此,我在api服务器上进行了轮询,然后我会添加代码以触发模型完成的快餐栏。
1)在我的应用程序组件中,我订阅了一个服务,该服务将侦听来自其他组件的公告 app.component.ts
ngOnInit(){
this.polllingCallService()
}
polllingCallService(){
this.polling_sub = this.pollingService.pollingAnnounced$.subscribe(
polling => {
this.polling = polling;
console.log('WOWWWWWWWWW')
if (this.polling){
this.pollingRemoteService(polling)
} else{
console.log('polling as nothing to do...')
}
});
} //end
从另一个组件,我发送公告
this.pollingService.announcePolling({'model_id':gg,'is_output':false});
它运作良好,但它按日志调用了两次:
WOWWWWWWWWW {model_id: "aaaaa", is_output: false}
WOWWWWWWWWW {model_id: "aaaaa", is_output: false}
以下执行两次:
this.pollingRemoteService(polling)
另一次是这么多次:
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
app.component.ts:132 WOWWWWWWWWW {model_id: "bbbbbb", is_output: false}
因此多次执行:
this.pollingRemoteService(polling)
所以,当我的投票服务应该是一次时,我会在api服务器上获得两次或更多次api服务器。
为什么会这样?
这是我的投票服务:
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class PollingService {
constructor() { }
private pollingAnnouncedSource = new Subject<object>();
// Observable string streams
pollingAnnounced$ = this.pollingAnnouncedSource.asObservable();
// Service message commands
announcePolling(polling: object) {
this.pollingAnnouncedSource.next(polling);
}
}
这是在app.component.ts上执行FYI的主要代码:
isEmpty(obj) {
console.log('yo dude',obj)
//https://coderwall.com/p/_g3x9q/how-to-check-if-javascript-object-is-empty
for(var key in obj) {
if(obj.hasOwnProperty(key))
return false;
}
return true;
}
pollingRemoteService(polling){
let url = this.getEndpointPollingUrl(this.polling_endpoint)
var result = Observable.interval(5000)
.switchMap(() => this._authHttp.get(url + '/' + polling['model_id']))
.map(res => res.json())
.takeWhile(models => this.isEmpty(models) == false);
this.af_poll = result.subscribe(
polldata => {
//this.polldata = polldata;
//console.log('really?',polldata)
//this.pollingComplete()
},
error => {
let error_json = JSON.parse(error.text())
console.log('error',error_json)
}
);
//console.log('this.af_poll',this.af_poll)
}
答案 0 :(得分:1)
听起来你可能有内存泄漏。通常需要手动清理手动生成的订阅。您的polling_sub
订阅永远不会在您给定的代码中清理和取消订阅。
您没有提及对unsubscribe
方法中生成的订阅的polllingCallService()
调用。如果您还没有,请将此方法添加到该组件:
ngOnDestroy() {
this.polling_sub.unsubscribe();
}