Javascript 使用Typescript中的异步函数返回值
我有以下TS功能:Javascript 使用Typescript中的异步函数返回值,javascript,typescript,asynchronous,Javascript,Typescript,Asynchronous,我有以下TS功能: CheckRegUser(u: User): boolean { let b: boolean = true; let toSend = { email: u.email }; this.http.post("http://localhost:8080/", toSend).subscribe((data: Valid) => { if(!data.validity){ b = false;
CheckRegUser(u: User): boolean {
let b: boolean = true;
let toSend = {
email: u.email
};
this.http.post("http://localhost:8080/", toSend).subscribe((data: Valid) => {
if(!data.validity){
b = false;
}
});
console.log(b);
return b;
}
在这里,我连接到ExpressJS后端,得到一个布尔结果。这部分工作正常,但问题是“return b”语句在“This.http”中的b值更改之前执行,因此无论来自Express的响应是什么,b始终为true
我知道TS和JS是异步的,这个问题就是由此引起的,但是我找不到正确的方法来解决我的问题。任何帮助都将不胜感激 您可以尝试使用
async wait
async CheckRegUser(u: User): Promise<boolean> {
let toSend = {
email: u.email
};
let k = await this.http.post("http://localhost:8080/", toSend).subscribe((data: Valid){
let b: boolean = true;
if(!data.validity){
b = false;
}
return b
});
console.log(k);
return k;
}
异步CheckRegUser(u:User):承诺{
让toSend={
电子邮件:u.email
};
让k=wait this.http.post(“http://localhost:8080/,toSend)。订阅((数据:有效){
设b:boolean=true;
如果(!data.validity){
b=假;
}
返回b
});
控制台日志(k);
返回k;
}
当我刚开始学习使用谷歌地图应用程序进行可观察/反应式编程时,我遇到了一个常见问题:D 很明显,当异步函数同步返回
b
(默认为true
)时,您意识到异步函数尚未改变b
布尔标志
要解决这个问题,可以更容易地重新构造函数,将可观察的
返回给调用者
并且可能会查找可观察的
链接或类似的概念承诺
链接
老例子:
CheckRegUser(u:用户):布尔值{
常数b:布尔值=真;
常数toSend={
电子邮件:u.email
};
const httpPost:observeable=this.http.post(“http://localhost:8080/“,托森)
const httpPostSubscription:Subscription=httpPost
.subscribe((数据:有效)=>{//这是异步的
如果(!data.validity){
b=假;
}
});
控制台日志(b);
返回b;//这是有效的同步,返回默认值'b=true`;
}
可能重复请注意,这意味着CheckRegUser
将返回的不是布尔值,而是承诺值
,并且应该在调用代码中相应地处理它(通过然后
,或者使用异步/等待
)@Cerberus我同意你的意见,async/wait的返回是一个承诺谢谢你的回复,它解决了我的问题!!感谢@Cerberus指出async返回了一个承诺。承诺不是价值!为什么这是公认的答案?@iGanja beacuseasync
函数返回承诺?感谢您非常详细的回答,它确实解释得很好,但我更希望有一个简单明了的解决方案来解决我的问题。但是,再次感谢你为写下这个答案所付出的努力!