我正在尝试异步/等待功能。我有这样的代码模仿请求:
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())
这样的代码?我不明白的是什么?
答案 0 :(得分:34)
每个async
函数都会返回一个Promise
对象。 await
语句在Promise
上运行,等待Promise
resolve
或reject
s。
所以不,即使您使用console.log
,也无法直接对异步函数的结果await
。{使用await
会使您的函数等待,然后返回一个立即解析的Promise
,但它不会为您打开Promise
。您仍然需要使用Promise
或使用async
打开await
函数返回的.then()
。
当您直接使用.then()
代替console.log
ging时,.then()
方法会将Promise的结果提供给您。但是,您无法从承诺的外部获得Promise
的结果。这是与Promises合作的模型的一部分。
答案 1 :(得分:1)
Return value of an async function将始终为AsyncFunction Object,在调用时将返回Promise
。您无法更改该返回类型。 async/await
的要点是在异步函数内轻松等待其他异步进程完成。
答案 2 :(得分:1)
用async
定义的函数总是返回Promise
。如果您返回的其他任何值都不是Promise
,则它将隐式包装在Promise
中。语句const json = await request();
会解开{返回的Promise
{1}}到普通对象request
。然后将其包装在{ foo: 'bar' }
中,然后再从Promise
返回,因此getJSON
是您调用Promise
时最终得到的。因此,要展开包装,您可以像完成操作一样调用getJSON()
或执行getJSON().then()
来获取已解析的值。