异步函数返回同步函数内部

时间:2020-11-11 15:01:27

标签: javascript function asynchronous

我一直在研究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);
  });
}

感谢您的帮助。

乔丹

1 个答案:

答案 0 :(得分:5)

fetchAndDecode()函数是否被推送到异步偶数队列

不。它是同步的。它只是调用一个函数(fetch)来触发异步事件。

为什么将此异步代码包装在同步声明中?为什么要把它包起来?

需要两个参数。它可以让您在这些参数更改时重用该函数,而无需重复整个正文。

声明会更正确

不,这只是冗长的内容。

await在您想暂停某个功能直到一个承诺被解决,然后在该功能内部使用已解决的值 时很有用。

您没有这样做。你刚回来。

“返回从获取中返回的承诺”比“创建新的承诺(并返回)”要简单得多。等待从获取中返回的承诺被解析,获取其值,然后使用该值解析第一个承诺。 “