请求失败会弹出一个 toast 如何保证批量请求失败 只弹出一个 toast

发布于 2024-12-01 22:12:50 字数 1849 浏览 6 评论 0

要确保批量请求失败时只弹出一个 toast,可以通过以下几种方式实现:

  1. 设置全局标志位:定义一个全局变量(如 isToastShown )来表示是否已经弹出过 toast。在请求失败的处理逻辑中,首先检查该标志位。如果尚未弹出 toast,则进行弹出操作,并设置标志位为 true ;如果标志位已经为 true ,则直接忽略后续的弹出操作。
  2. 使用防抖或节流函数:防抖(debounce)或节流(throttle)函数可以限制某个函数在一定时间内的执行次数。将弹出 toast 的操作封装在防抖或节流函数中,确保在短时间内的多个请求失败时,不会频繁弹出 toast。
  3. 集中处理错误:将所有请求的错误集中处理,而不是在每个请求的 catch 块中直接弹出 toast。例如,把所有请求的 Promise 添加到一个数组中,然后使用 Promise.all() 或其他类似方法来统一处理这些 Promise 的结果。如果所有请求都失败了,再弹出一个 toast。

以下是使用全局标志位和集中处理错误的示例代码:

let isToastShown = false; // 全局标志位

function makeRequests() {
  const requests = [fetchPost(), fetchComments()]; // 多个请求的 Promise

  Promise.all(requests)
  .then(() => {
      // 所有请求成功的处理逻辑
    })
  .catch(errors => {
      if (!isToastShown) { // 检查标志位
        notify(errors[0]); // 弹出 toast
        isToastShown = true; // 设置标志位为 true
      }
    });
}

function fetchJSON(url, input) {
  return fetch(url, input)
  .then(res => {
      if (res.ok) {
        return res.json();
      }
      const err = new HttpError(res);
      if (!isToastShown) { // 检查标志位
        notify(err); // 弹出 toast
        is toastShown = true; // 设置标志位为 true
      }
      throw err;
    });
}

在上述代码中,定义了一个全局变量 isToastShown 来标记是否已经弹出过 toast。在 fetchJSON 函数中,当请求失败时,如果 isToastShownfalse ,则弹出 toast 并设置其为 true 。在 makeRequests 函数中,使用 Promise.all 来处理多个请求。如果所有请求都失败(即 errors 数组有内容),并且 isToastShownfalse ,则弹出 toast 并设置标志位。

这样,无论有多少个请求失败,都只会弹出一个 toast。当有新的批量请求时,记得在请求开始前将 isToastShown 重置为 false

另外,如果使用的是一些前端框架或库,它们可能提供了更方便的方式来处理这种情况。例如,在 Vue.js 中,可以使用 Vuex 来管理全局状态,实现类似的功能。具体的实现方式可能会因项目的架构和使用的技术而有所不同,但基本思路是相似的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

你的呼吸

暂无简介

0 文章
0 评论
25 人气
更多

推荐作者

avyhlj

文章 0 评论 0

廾匸

文章 0 评论 0

自演自醉

文章 0 评论 0

臧立杰

文章 0 评论 0

mb_XvqQsWhl

文章 0 评论 0

鲜血染红嫁衣

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文