【问题标题】:asynchronous behavior of functions in typescript打字稿中函数的异步行为
【发布时间】:2019-01-08 04:55:17
【问题描述】:

我实现了这个sn-p的代码:

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

但是,尽管数据不为空,控制台打印一个空值,并且 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");
        }
      });

  }

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

【问题讨论】:

  • 好吧,在传递给 then() 的回调中打印它。那是初始化数据的时候。您已经知道这与异步有关,因此您应该知道数据只会异步可用,而不是同步可用,因此不会在调用方法后立即可用。
  • 对不起,你能发布一个代码示例吗?我是打字稿的傻瓜。非常感谢
  • 这称为异步编程。它与 TypeScript 无关。

标签: function typescript asynchronous


【解决方案1】:

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

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

执行顺序为:

  1. 第 1 行
  2. 第 3 行
  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
  });

【讨论】:

  • 精彩的解释,但“console.log()”只是一个调试字符串。我必须设置一个全局变量,而不是“console.log()”。我现在正在扩展我的问题,它应该如何真实
  • @AxeOwl 您应该移动所有取决于其中回调结果的逻辑...但是...请记住代码的可读性、可维护性、可扩展性等。所以也许您想重构这些较小的函数或任何其他适合您需要的替代方案中的代码块。
猜你喜欢
  • 2023-02-14
  • 2018-05-03
  • 2016-05-14
  • 2017-12-01
  • 2019-10-16
  • 2023-02-21
  • 2021-02-05
  • 2016-04-19
  • 1970-01-01
相关资源
最近更新 更多