繁体   English   中英

等待 Angular 9 中的对象响应

[英]Wait for an object response in Angular 9

这是我第一次在这里发帖,所以如果我做错了什么,我首先道歉。

我是 Angular 的新手,我从未使用过同步,所以请尽可能简单。

我的服务中有这个功能:

 validateDDBB(userName, teamName, email: string) {
    let requestUrl: string = '/api/tenniship/validator/user?userName=' + userName + '&teamName=' + teamName + '&email=' + email;
    const config = { headers: new HttpHeaders().set('Content-Type', 'application/json') };
    return this.http.get<Array<boolean>>(requestUrl, config);
  }

我想要一个注册表单。 我想知道我的数据库中是否已经注册了电子邮件、用户名和团队名称。 此函数向我发送一个大小为 3 的布尔数组,指示它们是否已经存在。

问题是运行的代码没有等待响应,所以得到的结果使用了垃圾数据。

我的组件功能:

databaseValidator(){
    this.loginService.validateDDBB(this.username, this.teamName, this.email).subscribe(
      res => {
        this.usedUsername = res[0].valueOf();
        this.usedTeamName = res[1].valueOf();
        this.usedEmail = res[2].valueOf();
        console.log("Data base info pulled: " + res);
        return true;
      },
    error => {
      console.error("Something went wrong: undefined: " + error);
      return false;
    }
    );
  }

我如何修改我的代码,例如,当我这样做时,我的代码将等待响应,所以我不使用垃圾数据?

onSubmit(){
    this.databaseValidator();
    //usedUsername, usedTeamName and usedMail are primitive boolean variables.
    console.log("Username: " + this.usedUsername);
    console.log("Team: " + this.usedTeamName);
    console.log("email: " + this.usedEmail);
}

非常感谢!

databaseValidator方法将立即然后控制台消息将在稍后打印 loginService 将被编译,有一些选项可以解决您的问题,例如传递回调,返回可观察承诺

这是你如何通过返回承诺来做到的

databaseValidator() : Promise<any> {
   return new Promise((resolve, reject) => {
    this.loginService.validateDDBB(this.username, this.teamName, this.email).subscribe(
      res => {
        this.usedUsername = res[0].valueOf();
        this.usedTeamName = res[1].valueOf();
        this.usedEmail = res[2].valueOf();
        console.log("Data base info pulled: " + res);
        resolve()
      },
    error => {
      console.error("Something went wrong: undefined: " + error);
      reject()
    }
    );
  }

onSubmit(){
    this.databaseValidator().then(()=>{

    console.log("Username: " + this.usedUsername);
    console.log("Team: " + this.usedTeamName);
    console.log("email: " + this.usedEmail);
    })  
}

因为databaseValidator 返回一个promise 我们可以使用async/await

async onSubmit(){
    await this.databaseValidator();

    console.log("Username: " + this.usedUsername);
    console.log("Team: " + this.usedTeamName);
    console.log("email: " + this.usedEmail); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM