【问题标题】:async/await always returns promiseasync/await 总是返回 promise
【发布时间】:2017-09-11 09:16:01
【问题描述】:

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

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

【问题讨论】:

  • async/await always returns promise - 这是正确的,所有标记为 async 的函数都会总是返回一个 Promise - 这就是 async/await 的全部意义

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


【解决方案1】:

上面的大部分答案都是正确的,你仍然需要更清楚地了解这个主题:

https://petetasker.com/using-async-await-jquerys-ajax

【讨论】:

    【解决方案2】:

    async 定义的函数总是返回Promise。如果您返回不是Promise 的任何其他值,它将被隐式包装在Promise 中。 语句const json = await request();request() 返回的Promise 解包为普通对象@987654328 @。然后在从getJSON 返回之前将其包装在Promise 中,因此Promise 是您调用getJSON() 时最终得到的结果。因此,要打开它,您可以像以前一样调用getJSON().then(),也可以调用await getJSON() 来获取解析后的值。

    【讨论】:

    • 恕我直言,这么多的扭曲和展开,如果你的答案更短,听起来很有希望
    • IKR,我想主要的收获是异步函数的返回值始终是一个承诺,因此必须与 await/then 一起使用才能获得解析的值。
    【解决方案3】:

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

    【讨论】:

    • 你的第一句话是矛盾的,它不能同时返回一个 Promise 和一个 AsyncFunction 对象。
    • @loganfsmyth,当你定义一个异步函数时,它会返回一个AsyncFunction Object调用时会返回一个Promise Object。以const t = async () => { ... } 为例,t 是一个AsyncFunction Objectt() 将返回一个Promise Object
    • 对,我的意思是措辞令人困惑,没有返回,它只是评估为AsyncFunction 的值并且该函数有返回。 async function fn(){} 是一个声明,它不返回任何内容,它只是 is 一个 AsyncFunction。
    • 我需要明确返回异步方法吗?如果我在异步方法中不返回任何东西会怎样
    【解决方案4】:

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

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

    当您直接使用.then() 而不是console.logging 时,.then() 方法使您可以使用 Promise 的结果。但是您无法从 Promise 外部获得Promise 的结果。这是使用 Promises 模型的一部分。

    【讨论】:

    • 我认为 async/await 的全部意义在于您可以使用同步代码编写异步 Promise 函数。你是说你总是必须用.then() 跟进async 函数吗?如果是这样,那么这与仅使用 Promise 本身有何不同?
    • 重点是 async 函数内,你可以编写异步代码,就好像它是同步的一样。但是,在async 函数的外部 中,您需要照常处理该函数的异步结果。这通常不是问题,因为无论如何您都应该只在 UI 逻辑中获得异步结果。
    • 总而言之:您编写异步逻辑就好像它是同步的,但是当您从实际上同步的代码中调用异步逻辑时,您需要区分实际-同步和实际异步。
    • 不需要额外的 cmets。缺少的元素是 await 以与 .then() 相同的方式简单地解包 Promise,但返回的内容再次包装在 Promise 中。这进一步意味着所有返回的新 Promise 语法糖都是为您处理的,因此使函数 async 为您免费执行此操作,您现在只需要抛出错误并使用 try / catch 来捕获拒绝或抛出的错误(同样的事情) .现在这一切都很有意义,所以感谢一百万!
    • "使用 await 会让你的函数等待,然后返回一个立即解析的 Promise,但它不会为你解开 Promise。"如果可以立即评估 awaited 的功能,它不会立即解决吗?就像在 OP 的示例中一样,promise 不会立即解决,因为它需要 2 秒。
    猜你喜欢
    • 2019-06-27
    • 2021-11-27
    • 2017-10-21
    • 2022-08-22
    相关资源
    最近更新 更多