JavaScript 函数中插入 Spinner 的正确姿势

javascript 函数中插入 spinner 的正确姿势

本文旨在解决在 JavaScript 函数中插入 Spinner(加载指示器)时遇到的问题,并提供两种基于 Promise 和 async/await 的解决方案,确保 Spinner 在数据处理期间正确显示,并在处理完成后隐藏,从而提升用户体验。通过示例代码,详细讲解了如何利用 async/await 以及 Promise.all 来管理异步操作,保证 Spinner 的正确显示和隐藏。

在 JavaScript 中,经常需要在执行耗时操作时显示一个 Spinner,以告知用户程序正在运行。一个常见的场景是在数据插入数据库时。然而,由于 JavaScript 的异步特性,直接控制 Spinner 的显示和隐藏可能会遇到问题。以下介绍两种解决方案,利用 async/await 和 Promise.all 来确保 Spinner 的正确显示和隐藏。

使用 async/await 控制 Spinner

async/await 使得异步代码看起来更像同步代码,从而更容易理解和维护。通过将 insertDataToDatabase 函数声明为 async,并在 $.ajax 调用前使用 await,可以确保 Spinner 在所有数据插入操作完成后才被隐藏。

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

代码解释:

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

事件监听器: 监听 id 为 insert 的元素的点击事件async 函数: 事件处理函数被声明为 async,允许使用 await 关键字。显示 Spinner: 点击事件发生后,首先显示 id 为 spinner 的元素。await insertDataToDatabase(results.data): 调用 insertDataToDatabase 函数,并使用 await 等待其完成。await 确保 JavaScript 引擎暂停执行,直到 insertDataToDatabase 函数返回一个 resolved 的 Promise。隐藏 Spinner: insertDataToDatabase 函数完成后,隐藏 Spinner。insertDataToDatabase 函数: 循环遍历数据,并对每个数据项发起 $.ajax 请求。await $.ajax(…): 在 $.ajax 调用前使用 await,确保每次请求都完成后再进行下一次循环。

注意事项:

确保 $.ajax 返回一个 Promise 对象,以便 await 能够正常工作。jQuery 的 $.ajax 默认返回 Promise。async/await 只能在 async 函数中使用。

使用 Promise.all 并行处理数据

如果数据插入的顺序不重要,可以使用 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) {},    });  }));}

代码解释:

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

data_noheader.map((row) =youjiankuohaophpcn { … }): 使用 map 方法将 data_noheader 数组中的每个元素转换为一个 Promise 对象。每个 Promise 对象代表一个 $.ajax 请求。Promise.all(…): Promise.all 接收一个 Promise 数组,并返回一个新的 Promise。这个新的 Promise 在所有输入的 Promise 都 resolved 时才 resolve。await Promise.all(…): 使用 await 等待 Promise.all 返回的 Promise resolve,确保所有 $.ajax 请求都完成后才继续执行。

优点:

并行处理数据,提高效率。

注意事项:

如果任何一个 $.ajax 请求失败,Promise.all 返回的 Promise 将 reject,并抛出一个错误。你需要适当地处理错误。如果对数据插入的顺序有要求,不应使用 Promise.all。

总结

以上两种方法都能够有效地在 JavaScript 函数中插入 Spinner,并确保 Spinner 在数据处理期间正确显示,并在处理完成后隐藏。选择哪种方法取决于你的具体需求。如果需要保证数据插入的顺序,使用 async/await 逐个处理;如果数据插入的顺序不重要,使用 Promise.all 并行处理可以提高效率。在实际开发中,根据具体情况选择合适的方案,能够更好地提升用户体验。

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

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月13日 09:26:14
下一篇 2025年11月13日 09:57:45

相关推荐

  • 如何实现单选功能:点击一个元素后,阻止其他相同元素被选中?

    如何实现多个相同元素的点击选择,选中一个后其他元素不可选? 当拥有多个相同元素且需要点击一个元素进行选择时,如何防止选中该元素后还能继续点击其他元素呢?这是一位开发人员遇到的难题。 这个问题的解决方法是: 在 ul 元素上添加一个 id,用于唯一标识该元素。 在点击事件中,遍历 ul 下的所有 li…

    2025年12月9日
    000
  • 如何用JavaScript限制单选评分元素,防止用户重复点击?

    如何限制多个评分元素,在选择一个后阻止其他元素被点击 您想要实现的功能是,在一个包含多个评分元素(例如按钮或链接)的列表中,当点击一个元素时,其他元素将被禁用且无法再次点击。 要实现此功能,可以采用以下步骤: 为 元素添加一个 id 立即学习“Java免费学习笔记(深入)”; 1 2 3 4 添加事…

    2025年12月9日
    000
  • 如何只允许用户单击一次评价选项,并阻止其他选项被点击?

    如何实现点击一个元素后,其他同类元素无法再次点击? 有四个评价选项,当用户单击其中一个评价并添加“on”类后,其他评价选项应该变为不可点击,并提示用户已经评价。 解决方法: 在 ul 标签上添加一个 id: 评价 1 评价 2 评价 3 评价 4 然后,使用 javascript 遍历 li 标签,…

    2025年12月9日
    000
  • 如何解决大小写敏感的URL跳转问题?

    如何解决大小写不敏感的内容地址跳转问题 您希望将包含小写路径(例如“http://xxxx/oa/pms/”)的地址重定向到相应的大写路径(“http://xxxx/oa/pms/”)。 解决方案 javascript 解决方案 在 index.html 页面中添加以下 javascript 代码:…

    2025年12月9日
    000
  • 甘特图选择困难症?过来人推荐哪款好用?

    最佳甘特图推荐:实践经验分享 在甘特图选择上苦苦寻求?以下是我们的推荐,专为那些亲身体验过的用户准备。 问题: 有推荐的甘特图推荐吗?最好是有实践经验的。市面上有不少选择,Ext JS 的官方网站却没有提及。是否有 Ext JS 的甘特图推荐? 回答: 经过深入搜索和实际使用,我们推荐以下甘特图: …

    2025年12月9日
    000
  • 有哪些好用的甘特图工具推荐?

    使用过的好用甘特图工具 对于甘特图工具,推荐使用 https://github.com/taitems/jQuery.Gantt/,因为它操作便捷且功能强大,许多程序员都对该工具给予了肯定的评价。 尽管 ExtJS 官网上可能没有专门的甘特图组件,但您可以使用第三方库或插件来实现甘特图功能。例如,j…

    2025年12月9日
    000
  • PHP中如何将XML文件处理结果存入变量?

    将处理xml文件的结果存入变量中 php中,你可以利用simplexml_load_string()函数将xml字符串转换为simplexml对象,该对象可以方便地访问xml文档中的数据。以下是一个示例,展示如何将xml文件的结果存入变量中: $string = <<<XML st…

    2025年12月9日
    000
  • PHP如何读取和处理XML文件并将数据保存到变量中?

    php 读取和处理 xml 文件 为了将 xml 文件中的数据保存到变量中,我们需要利用 php 中的内置函数。这通常涉及以下步骤: 加载 xml 文件: $xmlstring = ‘ status message remainpoint taskid successcounts’;$xmlobje…

    2025年12月9日
    000
  • PHP如何将XML文件内容解析并存储到变量中?

    php处理xml文件,将结果存入变量中 通过php对xml文件进行处理,可以将xml节点中的值提取出来,并存储到php变量中,以便于后期使用。具体步骤如下: 使用simplexml_load_string()函数加载xml字符串:可以使用该函数将xml字符串转换为simplexml对象,方便后续操作…

    2025年12月9日
    000
  • 如何将多层嵌套的JSON对象转换为易于操作的多维数组?

    给的json数据中,有很多层的对象,将对象嵌套多层不直观,所以一般我们将其转换为多维数组进行操作,转换方法便是遍历对象,然后将对象的每个属性挂载到该层级上,如果对象的属性具有子属性,则继续进行嵌套操作.具体操作: ‘use strict’;function convert(obj,keys,arr)…

    2025年12月9日
    000
  • Ubuntu下PHP无法创建目录或写入文件:如何解决权限问题?

    ubuntu 下 php 无法创建目录和写入文件 在 ubuntu 中配置 lamp 环境时,用户可能会遇到 php 无法创建目录及写入文件的情况。即使已将项目权限设置为 777,apache 仍会报告错误。本文将针对此问题提供解决方案。 php 代码片段如下: $max_size = 10000;…

    2025年12月9日
    000
  • JavaScript单次点击如何实现事件函数执行两次?

    js 单次点击事件执行多次 在 javascript 中,如何实现单次点击事件执行两次?设想有如下代码: function myfunction(id) { // 执行两次的内容} 要求实现的内容不能包含在函数名内,因为那样就不能在一开始就执行一次。考虑到动态生成的 id 和多个元素绑定该事件函数的…

    2025年12月9日
    000
  • 如何通过单次点击事件触发两次函数执行?

    如何通过单击事件触发两次函数 当使用单击事件时,您可能需要执行特定函数两次。然而,将代码包含在函数名中会阻止初始执行。本文介绍了一种解决此问题的方法。 解决方案: 为了实现单击事件执行两次,但代码不能包含在函数名中,可以使用以下解决方案: 定义一个全局变量 temp 并将其初始化为 1。在事件处理函…

    2025年12月9日
    000
  • 如何在一个点击事件中执行两次相同操作?

    如何在一次单击事件中执行两次操作 问题: 如何实现单击事件后的内容执行两次,且代码不能包含在函数名中,以避免在第一次触发时执行? 答案: 方法: 使用变量来跟踪单击次数。 具体步骤: 定义一个全局变量,初始值为 1。在单击事件处理函数中,增加该变量。在函数内检查变量值是否小于 3。如果小于 3,执行…

    2025年12月9日
    000
  • 如何实现PHP AES RSA加密算法与C#和Java的互通?

    php aes rsa 算法修改以与 c# 和 java 互通 您希望将 php 中的 aes 和 rsa 加密算法修改为与 c# 和 java 互通。具体来说,您希望能够使用这些语言相互加密和解密数据。 一种实现此目标的途径是创建一个 php 加密服务。该服务将作为一个中间层,允许您使用 c# 和…

    2025年12月9日
    000
  • 如何用jQuery实现类似谷歌搜索的自动提示功能?

    实现类似google suggest的功能 问题: 如何实现类似谷歌搜索框的自动提示功能? 回答: 可以使用 [jquery ui 自动提示](http://jqueryui.com/autocomplete/) 来实现此功能。 该插件为 控件提供自动完成功能。它从预定义的选项列表中提取匹配建议,并…

    2025年12月9日
    000
  • 如何解决系统参数设置中出现的“hash_file: failed to open stream”错误?

    根据企业情况设置系统参数 在设置系统参数时,如果遇到“hash_file(up/1437616281如何根据企业情况设置系统参数?.doc): failed to open stream: Invalid argument”错误时,可以通过以下方法解决: 当输入的路径是中文路径时,系统不会报错。但是…

    2025年12月9日
    000
  • 如何从数据库中获取数据并以 PHP 形式形成?

    要从 PHP 数据库中获取数据并将其显示在表单中,通常需要执行以下步骤:1.连接到数据库:使用 MySQLi 或 PDO 建立到数据库的连接。2.查询数据库:执行SQL查询以检索所需的数据。3.获取数据:从查询结果中获取数据。4.填充表单:使用获取的数据填写表单字段。 这是一个使用的简单示例MySQ…

    2025年12月9日
    000
  • 创建专注的领域应用程序 Symfony 方法(返回结果)

    介绍 这是本系列的最后一篇文章。在上一篇文章中,我们创建了一个应用程序服务,它使用 userentitybuilder 服务来创建实体。然后,使用条令实体管理器(这是一个基础设施服务)来持久化和刷新实体。 现在,是时候将结果返回到表示层了。 我想记住,在本系列的所有文章中,我们都将学说实体视为域实体…

    2025年12月9日
    000
  • (我的第一次)安装 Laravel

    有时,尤其是当您刚刚开始职业生涯时,您似乎遵循了指示却一事无成 – 而其他人似乎发现这非常容易。 这可能非常令人沮丧,我想描述一下即使在几十年之后我也经历完全相同的事情的几种方式。所以我在这里,试图详细描述我在努力让事情顺利进行时所犯的错误和失误。这是我关于这个主题的第一篇文章,但我希望…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信