60

我正在尝试异步/等待功能。我有这样的代码模仿一个请求:

const getJSON = async () => {
  const request = () => new Promise((resolve, reject) => (
    setTimeout(() => resolve({ foo: 'bar'}), 2000)
  ));

  const json = await request();
  return json;
}

当我以这种方式使用代码时

console.log(getJSON()); // returns Promise

它返回一个承诺

但是当我调用这行代码时

getJSON().then(json => console.log(json)); // prints { foo: 'bar' }

它按预期打印 json

是否可以只使用类似的代码console.log(getJSON())?我不明白什么?

4

3 回答 3

85

每个async函数都返回一个Promise对象。该await语句在 a 上运行Promise,一直等到Promise resolves 或rejects。

所以不,你不能console.log直接对异步函数的结果进行处理,即使你使用await. Usingawait会让你的函数等待,然后返回一个Promise立即解析的,但它不会Promise为你解开。您仍然需要解开函数Promise 返回的包装async,无论是 usingawait还是 using .then()

当您使用.then()而不是console.log直接使用 ging 时,该.then()方法使您可以使用 Promise 的结果。但是你不能Promise从Promise之外得到结果。这是使用 Promises 模型的一部分。

于 2017-04-15T06:30:29.543 回答
5

用 always 定义的函数async返回一个Promise. 如果您返回任何其他不是 a 的值Promise,它将被隐式包装在 a 中Promise 该语句const json = await request();Promise返回的 by解包request()为一个普通的 object { foo: 'bar' }。然后在Promise从返回之前将其包装在 a 中,getJSON因此 aPromise是您在调用时最终得到的getJSON()。因此,要打开它,您可以getJSON().then()像以前那样调用,也可以通过调用await getJSON()来获取已解析的值。

于 2020-01-01T16:45:10.403 回答
4

异步函数的返回值将始终是AsyncFunction ObjectPromise ,它会在调用时返回 a 。您不能更改该返回类型。重点async/await是在异步函数中轻松等待其他异步进程完成。

于 2017-04-15T06:32:57.063 回答