Javascript 使用Typescript中的异步函数返回值

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;

我有以下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;
      }
    });
    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 beacuse
async
函数返回承诺?感谢您非常详细的回答,它确实解释得很好,但我更希望有一个简单明了的解决方案来解决我的问题。但是,再次感谢你为写下这个答案所付出的努力!