使用一个信号进行多次 fetch() 以中止它们

Posted

技术标签:

【中文标题】使用一个信号进行多次 fetch() 以中止它们【英文标题】:Multiple fetch() with one signal in order to abort them all 【发布时间】:2018-02-26 22:17:21 【问题描述】:

我看到了另一个答案:https://***.com/a/47250621/2809729

那么我可以只使用一个信号中止多个获取请求吗?

【问题讨论】:

【参考方案1】:

在我写这个问题的时候,我已经在 this post on how to abort fetches 中找到了解决方案,该解决方案来自致力于实施中止的先驱之一。

所以是的,你可以:) 这里是一个简单的例子:

async function fetchStory( signal =) 
  const storyResponse = await fetch('/story.json',  signal );
  const data = await storyResponse.json();

  const chapterFetches = data.chapterUrls.map(async url => 
    const response = await fetch(url,  signal );
    return response.text();
  );

  return Promise.all(chapterFetches);

在上面的示例中,相同的信号用于初始提取和并行章节提取。以下是您如何使用 fetchStory:

const controller = new AbortController();
const signal = controller.signal;

fetchStory( signal ).then(chapters => 
  console.log(chapters);
);

在这种情况下,调用 controller.abort() 将拒绝正在进行的提取的承诺。

【讨论】:

【参考方案2】:

我对这个问题的解决方案进行了抽象,并提出了“fetch-tx”,即获取事务,它为所有相关的获取操作提供了一个单一的中止函数。

你可以在这里找到它: fetch-tx

【讨论】:

哦,好吧,实际上我最终创建了自己的 fetch 包装器,让您可以中止所有这些或单独中止它们中的每一个 giacomocerquone.com/blog/fetch-wrapper@OrBachar

以上是关于使用一个信号进行多次 fetch() 以中止它们的主要内容,如果未能解决你的问题,请参考以下文章

凯利公式

凯利公式

一段时间内阻止多次登录不成功的请求

014_linux驱动之_信号符号名描述和它们的信号值

如何从 chrome.usb 中的失速中恢复?

使用 jQuery 在初始 .mousedown() 事件后防止后续触发