JavaScript函数中插入加载指示器(Spinner)的正确方法

javascript函数中插入加载指示器(spinner)的正确方法

本文旨在解决在JavaScript函数中正确插入和控制加载指示器(Spinner)的问题。通过利用async/await和Promise.all,确保在异步操作完成前后,加载指示器能够准确显示和隐藏,提升用户体验。文章提供了两种实现方案,并详细解释了其原理和优势,帮助开发者更好地理解和应用异步编程。

在Web开发中,加载指示器(通常是Spinner)用于向用户表明后台正在执行耗时操作。在JavaScript函数中,尤其是在处理异步操作时,正确地显示和隐藏加载指示器至关重要,可以提升用户体验。以下介绍两种常用的实现方案,并分析其优缺点。

使用 async/await 控制加载指示器

async/await是JavaScript中处理异步操作的一种优雅方式。它使得异步代码看起来更像同步代码,易于理解和维护。

代码示例:

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

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

代码解释:

async function 声明异步函数,允许在函数内部使用 await 关键字。await 关键字用于等待一个Promise对象resolve。只有当Promise对象resolve后,才会继续执行后面的代码。在 click 事件处理函数中,首先显示加载指示器,然后使用 await 等待 insertDataToDatabase 函数完成。insertDataToDatabase 函数内部的 $.ajax 调用也使用了 await,确保每次Ajax请求完成后,才会进行下一次循环。

注意事项:

async/await 必须在 async 函数内部使用。await 只能等待Promise对象。如果等待的是其他类型的值,会被自动转换为Promise对象。如果 $.ajax 返回的不是 Promise 对象,需要将其包装成 Promise。

使用 Promise.all 并行执行异步操作

如果多个异步操作之间没有依赖关系,可以使用 Promise.all 并行执行,以提高效率。

代码示例:

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

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) => { … }) 将数据数组转换为一个包含Promise对象的数组。每个Promise对象代表一个Ajax请求。Promise.all(promiseArray) 接受一个Promise对象数组作为参数,并返回一个新的Promise对象。只有当数组中所有的Promise对象都resolve后,Promise.all 返回的Promise对象才会resolve。如果其中任何一个Promise对象reject,Promise.all 返回的Promise对象也会立即reject。await Promise.all(…) 等待所有Ajax请求完成。

优点:

可以并行执行多个异步操作,提高效率。

缺点:

如果其中一个异步操作失败,整个 Promise.all 都会失败,可能需要额外的错误处理。并行请求过多可能会导致服务器压力过大。

总结:

选择哪种方案取决于具体的应用场景。如果异步操作之间有依赖关系,或者需要对每个操作的结果进行处理,建议使用 async/await。如果异步操作之间没有依赖关系,且对性能要求较高,可以使用 Promise.all。无论选择哪种方案,都要确保在异步操作完成前后,加载指示器能够准确显示和隐藏,以提供良好的用户体验。

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

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
识别用户填写的空白:JavaScript 教程
上一篇 2025年12月20日 13:05:28
使用 JavaScript 将 textarea 内容导出为 DOCX 文件
下一篇 2025年12月20日 13:05:44

相关推荐

发表回复

登录后才能评论
关注微信