奇怪的行为在角2订阅时分配数据

问题描述:

我是新的角js 2和我想使用订阅,但我发现了一些奇怪的行为..当即时通讯使用html上的对象searchresult它有一些数据,但使用内部的TS文件的数据..有不确定奇怪的行为在角2订阅时分配数据

组件的某些问题,订阅该服务

私人SearchResult所IM:信息搜索结果;

constructor(public searchEngineSvc: SearchEngineService) { 
// this.searchResults = this.searchEngineSvc.retrieveData(); 
this.searchEngineSvc.pushedSearchResult.subscribe(
    data => { 
    this.searchResults = data; 
    console.log(this.searchResults); 
    console.log(this.searchResults.stats); 
    }, 
    error => {console.log(error);} 
); 
    } 

ngOnInit() { 
this.searchResults = this.searchEngineSvc.retrieveData(); 
} 

SERVICE

retrieveData() { 
this.searchResult = {}; 
this.searchResult = new SearchResult(new Stats(), [], []); 
console.log(this.searchResult); 
this.subscription = this.retrieveDataHttpCall().subscribe(
    searchResult => { 
    this.searchResult.data = searchResult.data; 
    this.searchResult.stats = searchResult.stats; 
    var ctr: number = 0; 
    for (var key in searchResult.aggregations) { 
     if (searchResult.aggregations.hasOwnProperty(key)) { 
     this.searchResult.aggregations.push(new Aggregation(key, false, [])); 
     for (var innerkley in searchResult.aggregations[key]) { 
      if (searchResult.aggregations[key].hasOwnProperty(innerkley)) { 
      this.searchResult.aggregations[ctr].aggregationObject.push(new AggregationObjects(innerkley, searchResult.aggregations[key][innerkley], true)); 
      } 
     } 
     ctr++; 
     } 
    }; 
    } 
); 
console.log(this.searchResult); 
this.pushedSearchResult.emit(this.searchResult); 
return this.searchResult; 
} 

这条线从分量将表现出一定的未定义的值

console.log(this.searchResults.stats); 

但这一个示出了它有一些数据

console.log(this.searchResults); 

MODEL

import { Stats } from './stats' 
import { Data } from './data' 
import { Aggregation } from './aggregation' 

export class SearchResult { 
    constructor(
     public stats?:Stats, 
     public data?:Data[], 
     public aggregations?:Aggregation[]){ 
    } 
} 

我解决它......把

this.pushedSearchResult.emit(this.searchResult); 

searchResult => {} 

因为这是我认为这是一个竞争条件的原因..所以里面puting它(SearchResult中=> {})会在广播前确保有数据。

retrieveData() { 
this.searchResult = {}; 
this.searchResult = new SearchResult(new Stats(), [], []); 
this.subscription = this.retrieveDataHttpCall().subscribe(
    searchResult => { 
    this.searchResult.data = searchResult.data; 
    this.searchResult.stats = searchResult.stats; 
    console.log(this.searchResult.stats); 
    var ctr: number = 0; 
    for (var key in searchResult.aggregations) { 
     if (searchResult.aggregations.hasOwnProperty(key)) { 
     this.searchResult.aggregations.push(new Aggregation(key, false, [])); 
     for (var innerkley in searchResult.aggregations[key]) { 
      if (searchResult.aggregations[key].hasOwnProperty(innerkley)) { 
      this.searchResult.aggregations[ctr].aggregationObject.push(new AggregationObjects(innerkley, searchResult.aggregations[key][innerkley], true)); 
       } 
      } 
      ctr++; 
      } 
     }; 
     console.log(this.searchResult); 
     this.pushedSearchResult.emit(this.searchResult); 
     } 
    ); 
    return this.searchResult; 
}