Javascript 异步/等待总是返回承诺

Javascript 异步/等待总是返回承诺,javascript,asynchronous,promise,async-await,ecmascript-2017,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; } 当我以这种方式使用代码时 con

我正在尝试异步/等待功能。我有类似于请求的代码:

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

每个
异步
函数返回一个
承诺
对象
await
语句对
Promise
进行操作,等待
Promise
解决
s或
拒绝
s


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


当您使用
.then()
而不是
console.log
ging时,
.then()
方法使承诺的结果对您可用。但是你不能从承诺之外得到
承诺的结果。这是使用承诺的模型的一部分。

将始终是一个,调用时将返回一个
承诺。您不能更改该返回类型。
async/await
的要点是在异步函数中轻松等待其他异步进程完成。

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

您的第一句话是矛盾的,它不能同时返回承诺和
异步函数
对象。@loganfsmyth,当您定义异步函数时,它将返回一个
AsyncFunction对象
,调用时将返回一个
Promise对象
。以
const t=async()=>{…}
为例,
t
是一个
AsyncFunction对象
,而
t()
将返回一个
Promise对象
对,我的观点是措辞混乱,没有返回,它只是计算为
AsyncFunction
的值,并且该函数有返回<代码>异步函数fn(){}
是一个声明,它不返回任何东西,它只是一个异步函数。我需要为异步方法显式返回吗?如果我在异步方法
异步/await中不返回任何东西会怎么样?这是正确的,因为所有标记为
async
的函数都将始终返回一个承诺-这就是async/await的全部要点我认为async/await的全部要点是,您可以使用同步代码编写异步承诺函数。你是说你必须始终使用
.then()
跟踪
异步
函数吗?如果是这样的话,那么这与仅仅使用承诺本身有什么不同呢?关键是在
async
函数中,您可以像编写同步代码一样编写异步代码。但是,在
async
函数之外,您需要像往常一样处理该函数的异步结果。这通常不是问题,因为您应该只在UI逻辑中获得异步结果。总之:您编写异步逻辑时,就好像它是同步的,但是当您从实际同步的代码调用异步逻辑时,您需要区分实际同步和实际异步。不需要额外的注释。缺少的元素是wait,它只是以与.then()相同的方式解包承诺,但返回的内容再次包装在承诺中。这进一步意味着所有的return-new-Promise语法糖都是为您处理的,因此使函数异步可以免费为您处理,您现在只需要抛出错误,并使用try/catch来捕获拒绝或抛出的错误(同样的事情)。现在这一切都很有意义,万分感谢!“使用
await
将使函数等待,然后返回一个立即解决的承诺,但它不会为您解除承诺。”如果可以立即评估正在等待的函数,它不会立即解决吗?就像在OP的例子中一样,承诺不会立即解决,因为它需要2秒钟。如此多的扭曲和展开IMHO,如果你把答案缩短,听起来很有希望,我想主要的收获是异步函数的返回值始终是一个承诺,因此必须与wait/then一起使用以获得解决的值。