async / await总是返回promise

时间:2017-04-15 06:22:56

标签: javascript asynchronous promise async-await ecmascript-2017

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

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

它返回一个Promise

但是当我调用这行代码时

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

按预期打印json

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

3 个答案:

答案 0 :(得分:34)

每个async函数都会返回一个Promise对象await语句在Promise上运行,等待Promise resolvereject s。

所以不,即使您使用console.log,也无法直接对异步函数的结果await。{使用await会使您的函数等待,然后返回一个立即解析的Promise,但它不会为您打开Promise。您仍然需要使用Promise或使用async打开await函数返回的.then()

当您直接使用.then()代替console.log ging时,.then()方法会将Promise的结果提供给您。但是,您无法从承诺的外部获得Promise的结果。这是与Promises合作的模型的一部分。

答案 1 :(得分:1)

Return value of an async function将始终为AsyncFunction Object,在调用时将返回Promise。您无法更改该返回类型。 async/await的要点是在异步函数内轻松等待其他异步进程完成。

答案 2 :(得分:1)

async定义的函数总是返回Promise。如果您返回的其他任何值都不是Promise,则它将隐式包装在Promise中。语句const json = await request();会解开{返回的Promise {1}}到普通对象request。然后将其包装在{ foo: 'bar' }中,然后再从Promise返回,因此getJSON是您调用Promise时最终得到的。因此,要展开包装,您可以像完成操作一样调用getJSON()或执行getJSON().then()来获取已解析的值。