2016-06-30 54 views
2

我有这种情况。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变量后执行。

有什么建议吗?

回答

7

我认为你可以在应用程序启动时预加载这些提示。为此,您可以利用APP_INITIALIZER服务。应用程序将等待返回的承诺在实际启动之前得到解决。

这里有一个例子:

provide(APP_INITIALIZER, { 
    useFactory: (service:GlobalService) =>() => service.load(), 
    deps:[GlobalService, HTTP_PROVIDERS], multi: true 
}) 

load方法,希望这样的事情:

load():Promise<Site> { 
    var promise = this.http.get('config.json').map(res => res.json()).toPromise(); 
    promise.then(config => this.devServer = config.devServer); 
    return promise; 
} 

然后你就可以直接使用devServer(同步)...

见这个问题在github上有更多的细节:

+1

关于'APP_INITIALIZER'的优秀提示!最后,AngularJS的'如何在初始化之前暂停应用程序'问题得到了公平的答案。 – estus

+0

嗨,我已经完成了这个方法,但是当我调试'APP_INITIALIZER'提供程序的承诺'service.load()'时,它总是返回undefined。我已经验证'load'方法在'GlobalService'中返回一个值,但是这个模块似乎在应用程序加载过程结束时被加载。 – snaphuman

+0

另外,在你的项目中使用[@nglibs \ config](https://github.com/nglibs/config),它会为你提供backend.json中的配置数据,这些数据在应用程序初始化过程中得到解决 –

相关问题