我有这种情况。Angular 2 - 在调用方法之前使用其他服务的服务
backend.json
{
"devServer": "http://server1/'",
"proServer" : "http://server2/'",
"use" : "devServer"
}
global.service.ts
import {Injectable} from '@angular/core';
import {Http, HTTP_PROVIDERS, Response, RequestOptions, URLSearchParams} from '@angular/http';
@Injectable()
export class GlobalService {
constructor(private _http: Http){}
getBackendServer(){
return this.server = this._http.get('./backend.json')
.map((res:Response) => res.json())
}
}
而且我有这个其他服务:search.service.ts
import {Injectable} from '@angular/core';
import {Http, HTTP_PROVIDERS, Response, RequestOptions, URLSearchParams} from '@angular/http';
import {GlobalService} from '../services/global.service';
import 'rxjs/add/operator/map';
@Injectable()
export class SearchService {
server;
constructor(private _http: Http, private gs: GlobalService) {
this.server = gs.getBackendServer().subscribe(
(data) => {
this.server = data[data.use];
},
(err) => {
console.log(err);
}
);
}
DoGeneralSearch(params:Search){
console.log(this.server);
let options = this.buildOptions(params);
return this._http.get(this.server + 'room/search', options)
.map((res:Response) => res.json())
}
}
我想什么做:看起来很明显:我想保留关于后端服务器的URL在JSON文件中的信息 - 并且全球服务应该返回在服务器中,这可以用于搜索服务的任何方法。
问题是:在全局服务能够解析任务以读取JSON文件并返回结果之前,DoGeneralSearch()方法执行。所以,我有一个this.server = Subscriber {isUnsubscribed:false,syncErrorValue:null,syncErrorThrown:false,syncErrorThrowable:false,isStopped:false ...}而不是结果本身。
我需要找到一些如何防止DoGeneralSearch方法在解析this.server变量后执行。
有什么建议吗?
关于'APP_INITIALIZER'的优秀提示!最后,AngularJS的'如何在初始化之前暂停应用程序'问题得到了公平的答案。 – estus
嗨,我已经完成了这个方法,但是当我调试'APP_INITIALIZER'提供程序的承诺'service.load()'时,它总是返回undefined。我已经验证'load'方法在'GlobalService'中返回一个值,但是这个模块似乎在应用程序加载过程结束时被加载。 – snaphuman
另外,在你的项目中使用[@nglibs \ config](https://github.com/nglibs/config),它会为你提供backend.json中的配置数据,这些数据在应用程序初始化过程中得到解决 –