angular2,我的服务通告多次执行

时间:2017-12-06 18:39:12

标签: angular

我不明白!

这就是我想要的。我在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)


  }

1 个答案:

答案 0 :(得分:1)

听起来你可能有内存泄漏。通常需要手动清理手动生成的订阅。您的polling_sub订阅永远不会在您给定的代码中清理和取消订阅。

您没有提及对unsubscribe方法中生成的订阅的polllingCallService()调用。如果您还没有,请将此方法添加到该组件:

ngOnDestroy() {
    this.polling_sub.unsubscribe();
}