use*_*314 28 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;
}
Run Code Online (Sandbox Code Playgroud)
当我以这种方式使用代码时
console.log(getJSON()); // returns Promise
Run Code Online (Sandbox Code Playgroud)
它返回一个Promise
但是当我调用这行代码时
getJSON().then(json => console.log(json)); // prints { foo: 'bar' }
Run Code Online (Sandbox Code Playgroud)
它按预期打印json
可以只使用像这样的代码console.log(getJSON())吗?我不明白什么?
Ped*_*lho 45
每个async函数都返回一个Promise对象.该await声明在运行Promise,等到Promise resolveS或reject秒.
所以不,console.log即使你使用,你也不能直接对异步函数的结果做await.使用await会让你的函数等待,然后返回一个Promise立即解析的函数,但是它不会Promise为你解开.您仍然需要使用或使用来解包函数Promise 返回的async函数.await.then()
当您直接使用.then()而不是console.logging时,该.then()方法会使Promise的结果可用.但是你无法Promise从Promise 之外得到结果.这是与Promises合作的模型的一部分.
异步函数的返回值始终是AsyncFunction ObjectPromise ,调用时将返回 a 。您无法更改该返回类型。要点async/await是轻松等待异步函数内其他异步进程完成。
用 定义的函数async总是返回一个Promise。如果您返回任何其他不是 a 的值,Promise它将被隐式包装在 a 中Promise。 该语句const json = await request();将Promise返回的 by 解包request()为一个普通对象{ foo: 'bar' }。然后在Promise返回之前将其包装在 a中,getJSON因此 aPromise是您调用getJSON(). 所以要解开它,你可以getJSON().then()像你所做的那样调用或await getJSON()获取解析值。