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

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

本文旨在解决在JavaScript函数中插入加载动画(Spinner)时遇到的异步问题。通过引入async/await和Promise.all,确保在数据处理完成前后正确显示和隐藏加载动画,提升用户体验。我们将提供两种实现方案,并详细解释其原理和优势。

在Web开发中,当执行耗时操作时,显示加载动画(Spinner)可以有效地提升用户体验。然而,在JavaScript中,由于异步操作的特性,直接控制Spinner的显示和隐藏可能会出现问题。本文将介绍如何正确地在JavaScript函数中插入Spinner,确保在数据处理开始时显示,并在处理完成后隐藏。

使用 async/await 控制 Spinner 显示和隐藏

最直接的解决方法是使用 async/await 关键字。async 关键字用于声明一个异步函数,而 await 关键字用于暂停异步函数的执行,直到一个 Promise 对象被解决(resolved)或拒绝(rejected)。

以下是一个示例:

立即学习“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) {},    });  }}

在这个例子中,insertDataToDatabase 函数被声明为 async 函数,并且在循环中使用 await 等待每个 $.ajax 请求完成。这意味着,只有当所有数据都成功插入数据库后,spinner.style.display = “none”; 才会执行,从而正确地隐藏 Spinner。

注意事项:

确保你的代码运行在支持 async/await 的环境中。现代浏览器都支持,但对于旧版本浏览器,可能需要使用 Babel 等工具进行转译。await 只能在 async 函数内部使用。

使用 Promise.all 并行处理请求

虽然 async/await 解决了异步问题,但循环中的 $.ajax 请求是串行执行的,效率较低。可以使用 Promise.all 并行处理这些请求,从而提高效率。

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) {},      });    })  );}

在这个例子中,data_noheader.map((row) =youjiankuohaophpcn { … }) 创建了一个包含所有 $.ajax 请求的 Promise 数组。Promise.all 接收一个 Promise 数组作为参数,并返回一个新的 Promise。这个新的 Promise 会在数组中所有 Promise 都解决后解决,或者在数组中任何一个 Promise 拒绝后拒绝。

优势:

并行执行请求,提高效率。代码更简洁,易于阅读。

注意事项:

如果任何一个请求失败,Promise.all 就会拒绝,导致 Spinner 无法隐藏。需要添加错误处理机制,例如使用 try…catch 块捕获错误。并行请求可能会对服务器造成压力,需要根据实际情况调整并发数量。

总结

在JavaScript函数中插入加载动画(Spinner)需要注意异步操作带来的问题。使用 async/await 可以确保代码按顺序执行,从而正确地控制 Spinner 的显示和隐藏。使用 Promise.all 可以并行处理请求,提高效率。选择哪种方法取决于具体的应用场景和性能需求。无论选择哪种方法,都应该充分考虑错误处理和性能优化,以提供最佳的用户体验。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/71233.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月13日 09:48:36
下一篇 2025年11月13日 10:13:00

相关推荐

发表回复

登录后才能评论
关注微信