Json Angular 4等待http.get execute继续

Json Angular 4等待http.get execute继续,json,angular,asp.net-web-api,promise,ionic3,Json,Angular,Asp.net Web Api,Promise,Ionic3,我正在用Ionic创建一个新的注册表单应用程序,并使用ASP.Net(C#)作为我的API 当输入模糊事件激活时,我想检查用户是否存在 问题在于,我的代码没有等到服务器返回值后才继续。 我做错了什么?有办法做到这一点吗? getData(data,func) { return new Promise( (resolve,reject)=>{ this.http.get(apiUrl+func, {params:data})

我正在用Ionic创建一个新的注册表单应用程序,并使用ASP.Net(C#)作为我的API

当输入模糊事件激活时,我想检查用户是否存在

问题在于,我的代码没有等到服务器返回值后才继续。 我做错了什么?有办法做到这一点吗?

   getData(data,func)
    {
        return  new Promise( (resolve,reject)=>{
          this.http.get(apiUrl+func, {params:data})  
          .subscribe(
           res=>{

            resolve(res.json());
          },
          async (err)=>{
            reject(err);

          });
        });
        }
这是我的API代码:

    [HttpGet]
    public JsonResult verifyEmail(string email)
    {
        var result = Domain.Repository.UserController.Find(email:email);
        if (result != null)
        {
            return Json(new { erro = true, message = "Email already registered!" }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(new { erro=false,message = "Email is valid!" },JsonRequestBehavior.AllowGet);
        }
    }
  validate()
  {
     let validEmail;
     validEmail= this.checkEmail();// I WANT THAT the "validEmail" receives returned value before continue.

     return true;
  }
  checkEmail()
  {
    return this.authService.getData({email:this.model.email},"Account/verifyEmail").then((result)=>{
      let response = <any>{};
      response=result;
      if(response.erro)
      {
        return response.message
      }else
      {
        return true
      }

    },(err)=>{
      this.toastService.presentToast("ERROR:"+err,"bottom",undefined,"toast-error");
    });
  }
我创建了一个提供程序来发出HTTP请求(authProvider):

   getData(data,func)
    {
        return  new Promise( (resolve,reject)=>{
          this.http.get(apiUrl+func, {params:data})  
          .subscribe(
           res=>{

            resolve(res.json());
          },
          async (err)=>{
            reject(err);

          });
        });
        }
这是我的register.ts代码:

    [HttpGet]
    public JsonResult verifyEmail(string email)
    {
        var result = Domain.Repository.UserController.Find(email:email);
        if (result != null)
        {
            return Json(new { erro = true, message = "Email already registered!" }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(new { erro=false,message = "Email is valid!" },JsonRequestBehavior.AllowGet);
        }
    }
  validate()
  {
     let validEmail;
     validEmail= this.checkEmail();// I WANT THAT the "validEmail" receives returned value before continue.

     return true;
  }
  checkEmail()
  {
    return this.authService.getData({email:this.model.email},"Account/verifyEmail").then((result)=>{
      let response = <any>{};
      response=result;
      if(response.erro)
      {
        return response.message
      }else
      {
        return true
      }

    },(err)=>{
      this.toastService.presentToast("ERROR:"+err,"bottom",undefined,"toast-error");
    });
  }
最后一件事是调用提供程序的函数:

    [HttpGet]
    public JsonResult verifyEmail(string email)
    {
        var result = Domain.Repository.UserController.Find(email:email);
        if (result != null)
        {
            return Json(new { erro = true, message = "Email already registered!" }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(new { erro=false,message = "Email is valid!" },JsonRequestBehavior.AllowGet);
        }
    }
  validate()
  {
     let validEmail;
     validEmail= this.checkEmail();// I WANT THAT the "validEmail" receives returned value before continue.

     return true;
  }
  checkEmail()
  {
    return this.authService.getData({email:this.model.email},"Account/verifyEmail").then((result)=>{
      let response = <any>{};
      response=result;
      if(response.erro)
      {
        return response.message
      }else
      {
        return true
      }

    },(err)=>{
      this.toastService.presentToast("ERROR:"+err,"bottom",undefined,"toast-error");
    });
  }
checkEmail()
{
返回这个.authService.getData({email:this.model.email},“Account/verifyEmail”)。然后((result)=>{
让响应={};
响应=结果;
if(response.erro)
{
返回response.message
}否则
{
返回真值
}
},(错误)=>{
this.toastService.presentToast(“ERROR:+err,“bottom”,未定义,“toast ERROR”);
});
}
提前谢谢

 getData(data,func)
    {
          this.http.get(apiUrl+func, {params:data})  
          .map(res => {
            return res.json();
          })
         .toPromise();
    }
或者使用异步/等待

 async getData(data,func)
    {
     let result = await this.http.get(apiUrl+func, {params:data})  
         .toPromise();
       return result.json();
    }
现在,验证函数:

  async validate()
  {
     let validEmail;
     await this.checkEmail();
     return true;
  }
关键是你不能从同步函数跳到异步函数,反之亦然。 Validate需要返回一个promise/observable,因为它执行异步函数

或者使用异步/等待

 async getData(data,func)
    {
     let result = await this.http.get(apiUrl+func, {params:data})  
         .toPromise();
       return result.json();
    }
现在,验证函数:

  async validate()
  {
     let validEmail;
     await this.checkEmail();
     return true;
  }
关键是你不能从同步函数跳到异步函数,反之亦然。

Validate需要返回一个promise/observable,因为它执行异步函数。

这是typescript还是js?@misha130这没什么大不了的。你好,misha,是它typescript@LazarLjubenović编写C#的人可能喜欢使用async/await。这就是为什么我问你如何使用
validate()
?这是typescript还是js?@misha130没什么关系。你好,是mishatypescript@LazarLjubenović编写C#的人可能喜欢使用async/await。这就是为什么我问你如何使用
validate()
?实际上异步等待在js中可用。同样,函数validate()继续返回true,在我从函数checkEmail()得到结果之前,为什么要将其转换为承诺?拉扎尔朱贝诺维奇他喜欢承诺。我不想对它做太多更改。@misha130谢谢你的帮助,尽管我也必须将寄存器函数转换为异步。但是现在它可以工作了,谢谢,js中提供了一个异步等待。同样,函数validate()继续返回true,在我从函数checkEmail()得到结果之前,为什么要将其转换为承诺?拉扎尔朱贝诺维奇他喜欢承诺。我不想对它做太多更改。@misha130谢谢你的帮助,尽管我也必须将寄存器函数转换为异步。但现在它起作用了,非常感谢