async/await 总是返回Promise

IT技术 javascript asynchronous promise async-await ecmascript-2017
2021-02-01 04:17:29

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

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个回答

每个async函数都返回一个Promise对象await语句对 a 进行操作Promise,直到Promise resolves 或rejects。

所以不,你不能console.log直接处理异步函数的结果,即使你使用await. 使用await将使您的函数等待,然后返回一个Promise立即解析的,但它不会Promise为您包。您仍然需要使用 using或 using解开函数Promise 返回的结果asyncawait.then()

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

问题的关键是,async功能,你可以写代码异步就好像它是同步的。然而,从外面async功能,你需要把该功能照常异步结果。这通常不是问题,因为无论如何您应该只在 UI 逻辑中获得异步结果。
2021-03-15 04:17:29
不需要额外的评论。缺少的元素是 await 以与 .then() 相同的方式简单地解包Promise,但返回的内容再次包装在Promise中。这进一步意味着所有返回的新 Promise 语法糖都会为您处理,因此使函数 async 免费为您执行此操作,您现在只需要抛出错误并使用 try / catch 来捕获拒绝或抛出的错误(同样的事情) . 现在这一切都很有意义,所以感谢一百万!
2021-03-16 04:17:29
“使用await将使您的函数等待,然后返回一个立即解决的 Promise,但它不会为您打开 Promise。” 如果await可以立即评估编辑的函数,它不会立即解决吗?就像在 OP 的例子中一样,promise 不会立即解决,因为它需要 2 秒。
2021-03-20 04:17:29
我认为 async/await 的全部意义在于您可以使用同步代码编写异步 Promise 函数。你是说你总是要跟进一个async函数.then()如果是这样,那么这与仅使用 Promise 本身有何不同?
2021-03-22 04:17:29
总结:您编写异步逻辑就好像它是同步的一样,但是当您从实际同步的代码中调用异步逻辑时,您需要区分实际同步和实际异步。
2021-04-03 04:17:29

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

这么多变形和展开恕我直言,如果你缩短答案,听起来很有希望
2021-04-02 04:17:29
IKR,我想主要的收获是异步函数的返回值始终是一个Promise,因此必须与 await/then 一起使用以获取解析值。
2021-04-09 04:17:29

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

@loganfsmyth,当你定义一个异步函数时,它会返回 a AsyncFunction ObjectPromise Object 当被调用时它会返回 a 就拿const t = async () => { ... }例如,tAsyncFunction Objectt()将返回Promise Object
2021-03-30 04:17:29
你的第一句话是矛盾的,它不能同时返回一个 Promise 和一个AsyncFunction对象。
2021-04-09 04:17:29
对,我的观点是措辞令人困惑,没有返回,它只是计算一个值为 anAsyncFunction并且该函数有返回的值。 async function fn(){}是一个声明,它不返回任何东西,它只是一个AsyncFunction。
2021-04-09 04:17:29
我需要明确返回异步方法吗?如果我不在异步方法中返回任何内容,它会如何
2021-04-10 04:17:29