在Angular 9中等待对象响应

时间:2020-03-27 19:36:04

标签: angular typescript web-applications frontend

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

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

我想要一个注册表格。我想知道我的数据库中是否已经注册了电子邮件,用户名和teamName。该函数向我发送了一个布尔数组,大小为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);
}

非常感谢!

1 个答案:

答案 0 :(得分:1)

databaseValidator 方法将立即运行,然后控制台消息将在稍后打印loginService时进行打印,有一些选项可以解决您的问题,例如传递回调,返回< strong>可观察到的或承诺

这是如何通过返回承诺

来实现的
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返回一个承诺,我们可以使用异步/等待

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

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