Angular 4等到http.get执行继续

Vin*_*ade 0 json promise asp.net-web-api ionic3 angular

我正在使用Ionic通过应用程序创建一个新的寄存器,并使用ASP.Net(C#)作为我的API。

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

问题是我的代码没有等到服务器返回值继续。我究竟做错了什么?有没有办法做到这一点?

这是我的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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我创建了一个提供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);

          });
        });
        }
Run Code Online (Sandbox Code Playgroud)

这是我的register.ts代码:

  validate()
  {
     let validEmail;
     validEmail= this.checkEmail();// I WANT THAT the "validEmail" receives returned value before continue.

     return true;
  }
Run Code Online (Sandbox Code Playgroud)

而最后一件事是我的职责,它将向提供者打电话:

  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");
    });
  }
Run Code Online (Sandbox Code Playgroud)

提前致谢..

mis*_*130 5

 getData(data,func)
    {
          this.http.get(apiUrl+func, {params:data})  
          .map(res => {
            return res.json();
          })
         .toPromise();
    }
Run Code Online (Sandbox Code Playgroud)

或使用异步/等待

 async getData(data,func)
    {
     let result = await this.http.get(apiUrl+func, {params:data})  
         .toPromise();
       return result.json();
    }
Run Code Online (Sandbox Code Playgroud)

现在使用validate函数:

  async validate()
  {
     let validEmail;
     await this.checkEmail();
     return true;
  }
Run Code Online (Sandbox Code Playgroud)

关键是您不能从同步功能跳到异步或反之亦然。验证需要返回一个promise / observable,因为它执行异步功能。

  • 实际上异步等待在js中可用。[MDN文档](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function)。它在[ES2017规格](https://tc39.github.io/ecma262/2017/#sec-async-function-definitions)中 (2认同)