提问者:小点点

Async/Await总是返回promise


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

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())的代码? 我不明白什么?


共3个答案

匿名用户

每个async函数都返回一个promise对象。 Await语句对Promise执行操作,等待Promise解析拒绝

因此,您不能直接对异步函数的结果执行console.log,即使您使用await。 使用await将使您的函数等待,然后返回一个promise,该函数将立即解析,但它不会为您打开promise。 您仍然需要使用await或使用.then()解包装promise函数返回的promise

当您直接使用.then()而不是console.logging时,.then()方法使您可以获得承诺的结果。 但是您不能从承诺之外获得承诺的结果。 这是承诺工作模式的一部分。

匿名用户

异步函数的返回值将始终是AsyncFunction对象,调用该对象时将返回一个promise。 您不能更改返回类型。 async/await的作用是在异步函数内部轻松地等待其他异步进程完成。

匿名用户

async定义的函数总是返回promise。 如果返回任何其他不是promise的值,它将被隐式包装在promise中。 语句const json=await request();将从request返回的promise解包装到普通对象{foo:'bar'}。 然后在从getJSON返回之前将其包装在promise中,因此当调用getJSON()时,最终得到的是promise。 因此,要解开它,您可以调用getJSON().then(),就像您已经做的那样,或者调用await getJSON()来获取解析值。