【问题标题】:Angular 2 - Services consuming others services before call a methodAngular 2 - 在调用方法之前使用其他服务的服务
【发布时间】:2016-06-30 15:39:03
【问题描述】:

我有这种情况。

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 文件中 - 全局服务应该返回服务器,以便可以在搜索服务的任何方法中使用.

问题是:DoGeneralSearch() 方法在全局服务能够解决读取 JSON 文件并返回结果的任务之前执行。所以,我有一个 this.server = Subscriber {isUnsubscribed: false, syncErrorValue: null, syncErrorThrown: false, syncErrorThrowable: false, isStopped: false...} 而不是结果本身。

我需要找到一些方法来防止在解析 this.server 变量后执行 DoGeneralSearch 方法。

有什么建议吗?

【问题讨论】:

    标签: angular angular2-services


    【解决方案1】:

    我认为您可以在应用程序启动时预加载此类提示。为此,您可以利用APP_INITIALIZER 服务。应用程序将等待返回的 Promise 被解析,然后才真正开始。

    这是一个示例:

    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上的这个问题:

    【讨论】:

    • APP_INITIALIZER 的优秀提示!最后,AngularJS 时代的“如何在初始化之前暂停应用程序”问题得到了一个公平的答案。
    • 嗨,我已经完成了这种方法,但是当我从 APP_INITIALIZER 提供程序调试承诺 service.load() 时,它总是返回未定义。我已经验证了load 方法在GlobalService 中返回了一个值,但是这个模块似乎是在应用程序加载过程结束时加载的。
    • 另外,在您的项目中使用@nglibs\config,这将为您提供来自 backend.json 的所需配置数据,这些数据在应用程序初始化期间得到解决
    • 在 APP_INITIALIZER 服务中,我需要从各种服务进行两次 HTTP 调用。有什么方法可以初始化
    猜你喜欢
    • 2017-08-23
    • 2020-03-29
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2018-05-05
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多