我一直在研究this MDN异步指南,以更好地理解异步代码。就像我感觉自己对异步代码/承诺有了更好的了解一样,我在该指南中遇到了此功能:
onLoadedMetadata
我的第一个倾向是不要挂在上面并通过它通电,但是,当然,它会在本指南后面的示例中建立起来,因此我希望这里有人可以帮助我解决这种特殊情况;运行在同步函数内部的异步函数。
我console.log()输出了,并且正在接收您期望的Promise对象。我可以看到这是因为我们正在返回一个异步函数(fetch),该函数将返回另一个promise(.then),然后返回另一个promise(.blob()或.text())。
我用谷歌搜索并环顾四周,但是找不到一个可以向我解释这种特殊情况的问题。我希望有人可以将我指向某个链接,或者对此进行充分的解释,以免让我觉得自己被困住了。
fetchAndDecode()函数是否被推送到异步事件队列,并且仅在主线程可用时才运行?如果是这样,代码如何知道要这样做?
为什么将此异步代码包装在同步声明中?为什么要把它包起来?
声明会更正确
function fetchAndDecode(url, type) {
return fetch(url).then(response => {
if(!response.ok) {
throw new Error('HTTP error! status: ${response.status}');
} else {
if(type === 'blob') {
return response.blob();
} else if(type === 'text') {
return response.text();
}
}
})
.catch(e => {
console.log(`There has been a problem with your fetch operation for resource "${url}": ` + e.message);
});
}
感谢您的帮助。
乔丹
答案 0 :(得分:5)
fetchAndDecode()函数是否被推送到异步偶数队列
不。它是同步的。它只是调用一个函数(fetch
)来触发异步事件。
为什么将此异步代码包装在同步声明中?为什么要把它包起来?
需要两个参数。它可以让您在这些参数更改时重用该函数,而无需重复整个正文。
声明会更正确
不,这只是冗长的内容。
await
在您想暂停某个功能直到一个承诺被解决,然后在该功能内部使用已解决的值 时很有用。
您没有这样做。你刚回来。
“返回从获取中返回的承诺”比“创建新的承诺(并返回)”要简单得多。等待从获取中返回的承诺被解析,获取其值,然后使用该值解析第一个承诺。 “