async/await总是返回promise

use*_*314 28 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;
}
Run Code Online (Sandbox Code Playgroud)

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

console.log(getJSON()); // returns Promise
Run Code Online (Sandbox Code Playgroud)

它返回一个Promise

但是当我调用这行代码时

getJSON().then(json => console.log(json)); // prints { foo: 'bar' }
Run Code Online (Sandbox Code Playgroud)

它按预期打印json

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

Ped*_*lho 45

每个async函数都返回一个Promise对象.该await声明在运行Promise,等到Promise resolveS或reject秒.

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

当您直接使用.then()而不是console.logging时,该.then()方法会使Promise的结果可用.但是你无法Promise从Promise 之外得到结果.这是与Promises合作的模型的一部分.

  • 关键是_within``async`函数,你可以编写异步代码,就好像它是同步的一样.但是,从_outside_`async`函数,您需要像往常一样处理该函数的异步结果.这通常不是问题,因为您应该只在UI逻辑中获得异步结果. (5认同)
  • 我认为async / await的全部目的是让您可以使用同步代码编写async Promise函数。您是说总是要通过.then()来跟进async函数吗?如果是这样,那与仅使用Promise相比有何不同? (4认同)
  • 总结:您将异步逻辑编写为同步,但是当您从_actually_ synchronous的代码调用异步逻辑时,您需要区分实际同步和实际异步. (4认同)

Oza*_*zan 5

异步函数的返回值始终是AsyncFunction ObjectPromise ,调用时将返回 a 。您无法更改该返回类型。要点async/await是轻松等待异步函数内其他异步进程完成。

  • 我的观点是,措辞令人困惑,没有返回值,它只是计算出一个“AsyncFunction”值,并且该函数有一个返回值。`async function fn(){}` 是一个声明,它不返回任何内容,它只是一个 AsyncFunction。 (3认同)
  • 你的第一句话是矛盾的,它不能同时返回 Promise 和 `AsyncFunction` 对象。 (2认同)

The*_*rch 5

用 定义的函数async总是返回一个Promise。如果您返回任何其他不是 a 的值,Promise它将被隐式包装在 a 中Promise 该语句const json = await request();Promise返回的 by 解包request()为一个普通对象{ foo: 'bar' }。然后在Promise返回之前将其包装在 a中,getJSON因此 aPromise是您调用getJSON(). 所以要解开它,你可以getJSON().then()像你所做的那样调用或await getJSON()获取解析值。

  • 这么多的扭曲和展开恕我直言,如果你让你的答案更短,听起来很有希望 (3认同)