这是我第一次在这里发帖,所以如果我做错了事,我首先道歉。
我在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);
}
非常感谢!
答案 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);
}