我正在尝试异步/等待功能。 我有这样的代码来模仿一个请求:
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
函数都返回一个promise
对象。 Await
语句对Promise
执行操作,等待Promise
解析
或拒绝
。
因此,您不能直接对异步函数的结果执行console.log
,即使您使用await
。 使用await
将使您的函数等待,然后返回一个promise
,该函数将立即解析,但它不会为您打开promise
。 您仍然需要使用await
或使用.then()
解包装promise
函数返回的promise
。
当您直接使用.then()
而不是console.log
ging时,.then()
方法使您可以获得承诺的结果。 但是您不能从承诺之外获得承诺
的结果。 这是承诺工作模式的一部分。
异步函数的返回值将始终是AsyncFunction对象,调用该对象时将返回一个promise
。 您不能更改返回类型。 async/await
的作用是在异步函数内部轻松地等待其他异步进程完成。
用async
定义的函数总是返回promise
。 如果返回任何其他不是promise
的值,它将被隐式包装在promise
中。 语句const json=await request();
将从request
返回的promise
解包装到普通对象{foo:'bar'}
。 然后在从getJSON
返回之前将其包装在promise
中,因此当调用getJSON()
时,最终得到的是promise
。 因此,要解开它,您可以调用getJSON().then()
,就像您已经做的那样,或者调用await getJSON()
来获取解析值。