Angular 为什么我的角度代码没有按顺序打印/运行?
试图理解为什么有些代码行在其他代码行之前运行,即使它们不是按那个顺序编写的 我在下面的文章中看到,他们在暗示承诺: 这里建议这样做吗?更重要的是,为什么?我不明白那篇文章的原因;它关注的焦点更多,因此如何 我试着研究js单线程、承诺、可观察性等。我还学习了一个教程,其中讨论了组件、模块、数据绑定、指令等,但不理解其中的原因Angular 为什么我的角度代码没有按顺序打印/运行?,angular,typescript,Angular,Typescript,试图理解为什么有些代码行在其他代码行之前运行,即使它们不是按那个顺序编写的 我在下面的文章中看到,他们在暗示承诺: 这里建议这样做吗?更重要的是,为什么?我不明白那篇文章的原因;它关注的焦点更多,因此如何 我试着研究js单线程、承诺、可观察性等。我还学习了一个教程,其中讨论了组件、模块、数据绑定、指令等,但不理解其中的原因 ngOnInit() { this.printNames(); //Gets info from database and creates a reactive for
ngOnInit() {
this.printNames(); //Gets info from database and creates a reactive form , then prints values to console
console.log("NgOnInit AFTER printNames()..");
}
printNames() {
this.GetUserInfoFromDB(userID.subscribe(result => {
this.dbt = result;
this.createForm();
}
createForm() {
this.profileForm = this.formbuilder.group({
'firstName': [this.dbt.firstName],
'lastName': [this.dbt.lastName],
});
console.log(this.profileForm.controls["firstName"].value);
console.log(this.profileForm.controls["lastName"].value);
}
-
GetUserInfoFromDB(userID:string)可观察{
让url=url+'/GetUserInfo';
设Params=newhttpparams();
Params=Params.append('userID'userID);
返回此.http.get(url,{params:params}).pipe(
catchError(this.handleError);
}
(实际结果)控制台显示:
- “在printNames()之后使用NgOnInit…”
- “约翰”
- “史密斯”
(Expectation)但我希望先打印名称,然后在this.http.get之后打印“NgOnInit”。
http请求在您的第一个日志之前发送,然后printNames方法完成,这样您就有了第一个日志,然后您就收到了http响应,从而执行subscribe方法中的代码(包括带有两个日志的createForm方法).请在您的
printNames
方法中添加dbt
内容。不,我不相信您的示例会重现您所说的内容。听起来好像有一个异步操作基于您的“从数据库获取信息…”注释,但这里没有说明。@seesharp,唯一要考虑的是当您进行异步调用时。实际上,调用前执行函数/指令、调用后执行函数/指令以及调用结束后执行函数/指令的方式是安全的,但您不能期望调用结束并继续执行函数/指令异步调用后的指令被删除finished@Phix,我添加了Observable Code确保与Observable异步的最佳方法是什么?您建议使用onCompleted as per?或setTimeout确保在我尝试获取值之前设置值?还是只将那些不来自DB的字段放入单独的隐藏形式?@seesharp我认为使用onCompleted(subscribe的第三个参数)是最好的解决方案。
GetUserInfoFromDB(userID: string) Observable<AProfile> {
let url = URL + '/GetUserInfo';
let Params = new HttpParams();
Params = Params.append('userID' userId);
return this.http.get<AProfile>(url, {params: Params}).pipe(
catchError(this.handleError);
}