首页 > web前端 > js教程 > 正文

JavaScript函数中插入加载动画(Spinner)的正确姿势

DDD
发布: 2025-09-14 18:25:01
原创
829人浏览过

javascript函数中插入加载动画(spinner)的正确姿势

本文旨在解决在JavaScript函数中正确插入加载动画(Spinner)的问题。通过示例代码,详细讲解如何使用async/await和Promise.all来确保Spinner在数据处理完成前后正确显示和隐藏,避免异步操作导致的显示问题,提升用户体验。

问题背景

在进行数据处理,特别是涉及异步操作(例如Ajax请求)时,为了提升用户体验,通常需要在数据加载或处理过程中显示加载动画(Spinner)。然而,如果处理不当,Spinner的显示和隐藏可能会出现问题,例如Spinner在数据处理完成前就消失,或者一直显示不消失。

使用 async/await 控制流程

async/await 是 JavaScript 中处理异步操作的强大工具,它可以使异步代码看起来更像同步代码,从而更容易理解和维护。要解决Spinner显示问题,关键在于确保在所有异步操作完成后再隐藏Spinner。

以下是一个使用 async/await 的示例:

立即学习Java免费学习笔记(深入)”;

document.getElementById("insert").addEventListener(
  "click",
  async function (event) {
    event.preventDefault();
    var spinner = document.getElementById("spinner");
    spinner.style.display = ""; // 显示 Spinner
    await insertDataToDatabase(results.data); // 等待数据插入完成
    spinner.style.display = "none"; // 隐藏 Spinner
  },
  false
);

async function insertDataToDatabase(data) {
  data_noheader = data.slice(1);

  for (i = 0; i < data_noheader.length; i++) {
    await $.ajax({
      url: "index.php",
      type: "POST",
      dataType: "json",
      data: {
        action: 'import',
        data: data_noheader[i],
      },
      success: function (response) {},
      error: function (response) {},
    });
  }
}
登录后复制

代码解释:

AssemblyAI
AssemblyAI

转录和理解语音的AI模型

AssemblyAI 65
查看详情 AssemblyAI
  1. async function: async 关键字用于声明一个异步函数。
  2. await: await 关键字用于暂停 async 函数的执行,直到一个 Promise resolve 或 reject。 在这个例子中,await insertDataToDatabase(results.data) 会暂停,直到 insertDataToDatabase 函数完成。同样,在 insertDataToDatabase 函数内部,await $.ajax({...}) 会暂停,直到每个 Ajax 请求完成。
  3. 事件监听器: 点击 insert 按钮时,首先显示 Spinner,然后调用 insertDataToDatabase 函数,等待该函数完成后,再隐藏 Spinner。

注意事项:

  • 确保你的 JavaScript 环境支持 async/await (现代浏览器都支持)。
  • 确保你使用的 Ajax 库(例如 jQuery)返回的是 Promise 对象。

使用 Promise.all 并发处理

如果数据插入的顺序不重要,可以使用 Promise.all 来并发执行多个 Ajax 请求,从而提高效率。

document.getElementById("insert").addEventListener(
  "click",
  async function (event) {
    event.preventDefault();
    var spinner = document.getElementById("spinner");
    spinner.style.display = "";
    await insertDataToDatabase(results.data);
    spinner.style.display = "none";
  },
  false
);

async function insertDataToDatabase(data) {
  data_noheader = data.slice(1);

  await Promise.all(
    data_noheader.map((row) => {
      return $.ajax({
        url: "index.php",
        type: "POST",
        dataType: "json",
        data: {
          action: "import",
          data: row,
        },
        success: function (response) {},
        error: function (response) {},
      });
    })
  );
}
登录后复制

代码解释:

  1. data_noheader.map((row) =youjiankuohaophpcn { ... }): map 方法用于将 data_noheader 数组中的每个元素(row)转换为一个 Promise 对象,每个 Promise 对象对应一个 Ajax 请求。
  2. Promise.all([...]): Promise.all 接收一个 Promise 数组,并返回一个新的 Promise。 这个新的 Promise 会在数组中所有的 Promise 都 resolve 后 resolve,或者在数组中任何一个 Promise reject 后 reject。
  3. 并发请求: Promise.all 允许同时发送多个 Ajax 请求,而不需要等待每个请求完成。 这可以显著提高数据插入的速度。

注意事项:

  • 如果数据插入的顺序很重要,则不应该使用 Promise.all。
  • 并发请求可能会对服务器造成更大的压力,需要根据实际情况进行调整。

总结

通过使用 async/await 和 Promise.all,可以有效地控制异步操作的流程,确保 Spinner 在数据处理完成前后正确显示和隐藏。选择哪种方法取决于具体的应用场景,如果需要保证顺序,则使用 async/await 逐个处理;如果顺序不重要,则使用 Promise.all 并发处理,提高效率。 无论选择哪种方法,都应该确保正确处理 Promise 的 resolve 和 reject 情况,以避免出现意外错误。

以上就是JavaScript函数中插入加载动画(Spinner)的正确姿势的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号