奇怪的行为在角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;
}