Function typescript中函数的异步行为

Function typescript中函数的异步行为,function,typescript,asynchronous,Function,Typescript,Asynchronous,我实现了以下代码片段: var tmpString = null; this.restProvider.validateUser(this.registerCredentials.email, this.registerCredentials.password) .then(data => { tmpString = JSON.stringify(data); }); console.log(tmpString); 但是,尽管数据不

我实现了以下代码片段:

var tmpString = null;
    this.restProvider.validateUser(this.registerCredentials.email, this.registerCredentials.password)
      .then(data => {
        tmpString = JSON.stringify(data);
      });
    console.log(tmpString);
但是,尽管数据不是空的,console打印空值,并且tmpString在短时间后被设置为正确的值。我怎样才能解决这个问题?谢谢

真正的功能是:

registerNewUser()
  {
    var tmpString = null;
    this.restProvider.validateUser(this.registerCredentials.email, this.registerCredentials.password)
      .then(data => {
        tmpString = JSON.stringify(data);
      });
    console.log(tmpString);
    if(tmpString == "false")
    {
      return false;
    }
    else
    {
      this.registerCredentials.email = JSON.parse(tmpString).email;
      this.registerCredentials.password = JSON.parse(tmpString).password;
      this.email = JSON.parse(tmpString).email;
      this.password = JSON.parse(tmpString).password;
    }
    return this.email + this.password;
  }
我用它

public login() {
    this.showLoading();
    this.registerNewUser();

    if(this.email == "false" && this.password == "false")
    {
      this.showError("Access Denied");
    }
    else
    {
      this.auth.login(this.registerCredentials);
      this.showError("Access Permit");

    }
}
我决定这么做

registerNewUser()
  {
    var tmpString = null;
    this.restProvider.validateUser(this.registerCredentials.email, this.registerCredentials.password)
      .then(data => {
        tmpString = JSON.stringify(data);
        if(tmpString == "false")
        {
          this.showError("Access Denied");
        }
        else
        {
          this.registerCredentials.email = JSON.parse(tmpString).email;
          this.registerCredentials.password = JSON.parse(tmpString).password;
          this.email = JSON.parse(tmpString).email;
          this.password = JSON.parse(tmpString).password;

          this.auth.login(this.registerCredentials);
          this.showError("Access Permit");
        }
      });

  }

但这是正确的解决方案吗?

考虑到以下代码(用行号注释):

执行顺序为:

  • 第1行
  • 第3行
  • 第2行
  • 这是因为当到达第3行时,异步请求尚未完成。因此,要正确打印
    tmpString
    ,请移动
    console.log(tmpString)在第2行之后,在回调内部(响应到达时),如下所示:

    var tmpString = null; // 1
    this.restProvider.validateUser(this.registerCredentials.email, this.registerCredentials.password)
      .then(data => {
        tmpString = JSON.stringify(data); // 2
        console.log(tmpString); // 3
      });
    

    那么,在传递给then()的回调中打印它。这就是数据初始化的时间。您已经知道这与异步有关,因此您应该知道数据将仅异步可用,而不是同步可用,因此不会在调用方法后立即可用。对不起,您可以发布一个代码示例吗?我是打字稿的傻瓜。多谢了,这叫做异步编程。这与TypeScript无关。很好的解释,但“console.log()”只是一个调试字符串。我必须设置一个全局变量,而不是“console.log()”。我现在提出的问题是,它应该是怎样的real@AxeOwl您应该将依赖于回调结果的所有逻辑移到其中…但是。。。请记住代码的可读性、可维护性、可伸缩性等。因此,您可能希望在较小的函数或任何其他适合您需要的替代方案中重构这些代码块。
    var tmpString = null; // 1
    this.restProvider.validateUser(this.registerCredentials.email, this.registerCredentials.password)
      .then(data => {
        tmpString = JSON.stringify(data); // 2
        console.log(tmpString); // 3
      });