我正在尝试异步/等待功能。我有这样的代码来模拟一个请求:
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())这样的代码吗?我有什么不明白的?
发布于 2017-04-15 14:30:30
对于每个async Promise 函数,都会返回一个。await语句在Promise上运行,一直等到Promise resolves或rejects。
因此,即使使用await,也不能直接对异步函数的结果执行console.log。使用await将使您的函数等待,然后返回一个可立即解析的Promise,但它不会为您解开Promise。您仍然需要使用await或.then()对async函数返回的Promise进行解包。
当您使用.then()而不是直接使用console.logging时,.then()方法使Promise的结果可供您使用。但是您不能从Promise之外获得Promise的结果。这是承诺工作模型的一部分。
发布于 2020-01-02 00:45:10
使用async Promise**. 定义的函数始终返回with如果您返回的任何其他值不是** Promise**,,它将被隐式地包装在一个** Promise**.**中。语句const json = await request();将request()返回的Promise解包为一个纯对象{ foo: 'bar' }。在从getJSON返回之前,它被包装在一个Promise中,因此当您调用getJSON()时,最终会得到一个Promise。因此,要解开它,您可以像以前一样调用getJSON().then(),也可以执行await getJSON()来获取已解析的值。
发布于 2017-04-15 14:32:57
Return value of an async function将始终是一个AsyncFunction Object,当调用时将返回一个Promise。您不能更改该返回类型。async/await的要点是在异步函数中轻松等待其他异步进程完成。
https://stackoverflow.com/questions/43422932
复制相似问题