【问题标题】:Angular 4 wait till http.get execute to continueAngular 4 等到 http.get 执行才能继续
【发布时间】:2018-06-21 20:31:46
【问题描述】:

我正在使用 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);
        }
    }

我创建了一个提供者来发出 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 代码:

  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");
    });
  }

提前谢谢..

【问题讨论】:

  • 这是打字稿还是js?
  • @misha130 没关系。
  • 你好 misha 这是打字稿
  • @LazarLjubenović 编写 C# 的人可能喜欢使用 async/await。这就是我问的原因
  • 你是如何使用validate()的?

标签: json angular asp.net-web-api promise ionic3


【解决方案1】:
 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,因为它执行的是异步函数。

【讨论】:

  • 实际上异步等待在 js 中可用。 MDN Docs。它在ES2017 specs
  • 同样的事情,在我从函数 checkEmail() 得到结果之前,函数 validate() 继续返回 true
  • 你为什么要把它转换成一个承诺?这比 Observables 倒退了一步。
  • @LazarLjubenović 他喜欢承诺。我不想改变太多。
  • @misha130 感谢您的帮助,尽管我也不得不将我的寄存器功能转换为异步。但现在它正在工作,非常感谢
猜你喜欢
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多