异步等待行为

Async Await Behaviour

一段简单易懂的代码async/await快把我逼疯了。

我点击了一个按钮,我正在从本地存储中读取一些值并将其显示在警告框中。在显示警报之前,我想 console.log 该值。

如果我理解 async/await 我的代码应该完全正确,但它以相反的顺序工作。首先是警报,然后是控制台。

//按钮点击时调用的方法

findMyAge2() {
    this.getData("age").then(result => {
      console.log('Hi');
      myAge2 = result;
    });
    alert(myAge2);
  }

  async getData(key): Promise<any> {
    return await this.storage.get(`${key}`);
  }

预期结果: 在控制台日志中:嗨 UI:年龄

实际结果: UI:年龄 在控制台日志中:嗨

试试这个方法,

findMyAge2() {
    this.getData("age").then(result => {
      console.log('Hi');
      myAge2 = result;
      alert(myAge2);
    });
  }

  async getData(key): Promise<any> {
    return await this.storage.get(`${key}`);
  }

在检索数据之前,您应该等待 alert

async/await 的工作方式与 promises 类似,这意味着代码被执行但您不知道它何时会完成,您只知道在 if 完成后,您想要执行其他内容。

这正是您放入 "then" 函数中的内容,即在第一部分 (asyc getData) 执行后执行的内容。

对于您的代码,当您单击按钮时会调用 findMyAge2,然后它会执行 getData 并在 "then" 块中指定从该调用获取结果后发生的情况。 因此,您只需将警报移动到 "then" 块中,然后您就会得到您期望的结果。

var myAge2;

findMyAge2() {
    this.getData("age").then(result => {
      console.log('Hi');
      myAge2 = result;
      alert(myAge2);
    });
}

async getData(key): Promise<any> {
    return await this.storage.get(`${key}`);
}

JavaScript 本质上是异步的,所以当你有一个 Promise returned 时,代码继续执行并且 Promise 稍后解析。

async/await 是一种控制这种编程流程的方法,可以让您创建同步代码,"awaits" 作为异步执行的结果。

你的问题是你想 return 来自你的 getData 函数的 promise 和 await 它在你的 findMyAge2 函数中。

async function findMyAge2() {
  let result = await this.getData("age");
  console.log('Hi');
  myAge2 = result;
  alert(myAge2);
}

async getData(key): Promise<any> {
  return this.storage.get(`${key}`);
}

通过向函数添加 async 关键字,它现在总是 return 一个 Promise。所以你不需要 await 在你的 return 语句中。这实际上什么都不做。这就像在说:

function getData(key) {
  return new Promise(resolve => {
    return localStorage.get(`${key}`).then(result => resolve(result))
  })
}

您不需要在本地存储中等待该结果,因为无论如何消费者都应该对结果调用 await.then