gpt4 book ai didi

typescript - Angular 2服务的异步初始化

转载 作者:太空狗 更新时间:2023-10-29 16:54:37 27 4
gpt4 key购买 nike

我有一个 Angular 2 服务,它需要在初始化时执行异步工作,并且在此初始化完成之前不应该可用。

@Injectable()
export class Api {
private user;
private storage;

constructor(private http: Http) {
this.storage = LocalStorage;
this.storage.get('user').then(json => {
if (json !== "") {
this.user = JSON.parse(json);
}
});
}

// one of many methods
public getSomethingFromServer() {
// make a http request that depends on this.user
}
}

就目前而言,此服务已初始化,并立即返回给使用它的任何组件。该组件随后在其 ngOnInit 中调用 getSomethingFromServer(),但此时 Api.user 未初始化,因此发送了错误的请求。

生命周期 Hook (OnInitOnActivate 等)不适用于服务,只能用于组件和指令,所以我不能使用它们。

get() 调用中存储 Promise 需要依赖于用户等待它的所有不同方法,导致大量代码重复。

在 Angular 2 中进行服务异步初始化的推荐方法是什么?

最佳答案

在研究了 Thierry 的答案之后,我发现它只能工作一次,但它确实让我走上了正确的道路。我不得不存储用户的 promise ,并创建一个新的可观察对象,然后对其进行 flatMap 编辑。

@Injectable()
export class Api {
private userPromise: Promise<User>;

constructor(private http: Http) {
this.userPromise = LocalStorage.get('user').then(json => {
if (json !== "") {
return JSON.parse(json);
}
return null;
});
}

public getSomethingFromServer() {
return Observable.fromPromise(this.userPromise).flatMap((user) => {
return this.http.get(...).map(...);
});
}
}
}

这确保 flatMap 函数在每次被调用时都能获得用户,而不是像 Thierry 的回答那样只是第一次。

关于typescript - Angular 2服务的异步初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36387308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com