Angular 为什么我的角度代码没有按顺序打印/运行?

Angular 为什么我的角度代码没有按顺序打印/运行?,angular,typescript,Angular,Typescript,试图理解为什么有些代码行在其他代码行之前运行,即使它们不是按那个顺序编写的 我在下面的文章中看到,他们在暗示承诺: 这里建议这样做吗?更重要的是,为什么?我不明白那篇文章的原因;它关注的焦点更多,因此如何 我试着研究js单线程、承诺、可观察性等。我还学习了一个教程,其中讨论了组件、模块、数据绑定、指令等,但不理解其中的原因 ngOnInit() { this.printNames(); //Gets info from database and creates a reactive for

试图理解为什么有些代码行在其他代码行之前运行,即使它们不是按那个顺序编写的

我在下面的文章中看到,他们在暗示承诺:

这里建议这样做吗?更重要的是,为什么?我不明白那篇文章的原因;它关注的焦点更多,因此如何

我试着研究js单线程、承诺、可观察性等。我还学习了一个教程,其中讨论了组件、模块、数据绑定、指令等,但不理解其中的原因

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);
}