当我执行以下代码时:
async function getURL(url) {
let response = await fetch(url);
let parsedResponse = await response.json();
return(parsedResponse.activity)
}
(async() => {
console.log(getURL('https://www.boredapi.com/api/activity/'));
})();
控制台记录待处理的承诺
VM87:8 Promise {<pending>}
我的理解是等待:
await 通常用于通过传递 Promise 作为表达式来解开 Promise。使用await 会暂停其周围异步函数的执行,直到promise 得到解决(即履行或拒绝)。当执行恢复时,await 表达式的值将变为已履行的 Promise 的值。
我期望
await response.json()
在解析 json 并且 parsedResponse 的值是一个 json 对象时暂停执行我的代码。
我知道如果我这样做
console.log(await getURL('https://www.boredapi.com/api/activity/'));
我会得到正确的回应。
然后我尝试了
return(await parsedResponse.activity)
,这样我就不必每次调用该函数时都使用await。但这也返回了响应。
我不明白为什么将await放在parsedResponse.activity上不会“解开”承诺,但在getURL函数上执行它却可以。
fetch
返回 promise
,因此 async/await
。您可以避免将 fetch
包裹在 async/await
内。但如果你仍然想使用它,你可以通过在 getURL
中使用
await
来等待
IIFE
完成执行
async function getURL(url) {
let response = await fetch(url);
let parsedResponse = await response.json();
return parsedResponse.activity
}
(async() => {
const res = await getURL('https://www.boredapi.com/api/activity/');
console.log(res);
})();