首先说,javascript没有多线程这样一个说法,我说的只是类似那种效果。其次,不建议使用这种方式解决问题,多线程应该交给后台去做。

但是,如果非要这样用,有什么方法呢?

我在工作中就遇到了这样的问题,由于功能等着急用,整体改进会涉及到前后台,改动会非常大,所以先想了一个临时性的解决方法。
问题场景是:后台管理系统中有一个表格界面,有一千多条记录,需要为这一千多条记录每条记录生成一堆关联数据,通过多选行和点击触发按钮执行。要生成的关联数据比较大,涉及到往几十张表里插入记录,因此每条记录的生成过程比较耗时,大概3秒左右。而问题是,这个界面在批量执行时没有进度显示,仅显示处理中...,在执行一千多条记录时,等待的时间非常长,用户往往认为系统死了。为了解决这个问题,我改进了前端处理方法。

思路是:前端模拟一定数量的“线程”提交Http请求,每个请求完成后更新计数器值并显示进度,如果还有数据需要处理,“线程”再自我递归调用,直到数据池里的所有数据处理完毕。

举例:将100万元散人民币分别分给10个人(10个线程)去整理,按1万元进行打捆,每人一次只能拿1万元,打捆完毕后再拿1万元,周而复始,直到100万元人民币都整理完。

需要用到的关键api:

setInterval(function) -- 这个可以用来防止界面阻塞,每个ajax执行完成后都可以更新界面进度显示。

(function(){})() -- 匿名函数,用于定义一个函数并立即执行。

arguments -- javascript function的内部变量,是对函数本身及参数的引用。

callee() -- 触发函数的自我递归方法

原理及方法:循环执行一定数量的ajax异步请求方法,每个ajax执行完成后再自我递归回调,每次请求完成更新统计变量,直到所有任务执行完毕。

代码示例:

 1 messageBox.show("处理中...");
2
3 //使用setInterval延迟执行
4 setInterval(function(){
5 //创建一批10个“线程”
6 for(var i=0;i<10;i++){
7
8 //使用匿名函数(方便直接自我递归调用)
9 (function(){
10 //如果所有数据已处理完,退出(略)
11 //获取一批未处理的记录(略)
12 var funarg = arguments;//得到匿名函数本身引用
13 ajax({
14 url:'xxx',
15 param:'ids=1,2,3',
16 async:false,
17 callback:function(){
18 //改变界面进度、改变已处理列表(略)
19
20 //匿名函数自我递归调用
21 funarg.callee();
22
23 }
24 });
25 })();
26 }
27 },200);

前端模拟“多线程”提交Http请求的更多相关文章

  1. Mock.js 与 fiddler 前端模拟数据与拦截请求

    最近 工作需要  接触了Mock.js. Mock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试.提供了以下模拟功能: 根据数据模板生成模拟数据 模拟 Ajax ...

  2. Java中使用多线程、curl及代理IP模拟post提交和get访问

    Java中使用多线程.curl及代理IP模拟post提交和get访问 菜鸟,多线程好玩就写着玩,大神可以路过指教,小弟在这受教,谢谢! 更多分享请关注微信公众号:lvxing1788 ~~~~~~ 分 ...

  3. MVC身份验证.MVC过滤器.MVC6关键字Task,Async.前端模拟表单验证,提交.自定义匿名集合.Edge导出到Excel.BootstrapTree树状菜单的全选和反选.bootstrap可搜索可多选可全选下拉框

    1.MVC身份验证. 有两种方式.一个是传统的所有控制器继承自定义Control,然后再里面用MVC的过滤器拦截.所以每次网站的后台被访问时.就会先走入拦截器.进行前端和后端的验证 一个是利用(MVC ...

  4. Java中使用多线程、curl及代理IP模拟post提交和get訪问

    Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~ ...

  5. [转]php模拟post提交请求,调用接口

    本文转自:https://www.cnblogs.com/jiqing9006/p/3949190.html /** * 模拟post进行url请求 * @param string $url * @p ...

  6. php模拟post提交请求,调用接口

    /** * 模拟post进行url请求 * @param string $url * @param string $param */ function request_post($url = '', ...

  7. php使用curl模拟多线程发送请求

    每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...

  8. php模拟post提交请求与调用接口

    /** * 模拟post进行url请求 * @param string $url * @param string $param */ function request_post($url = '', ...

  9. CURL 模拟http提交

    1:CURL模拟get提交 private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETUR ...

  10. web前端防治重复提交

    web前端开发中防治重复提交 web前端数据请求或者表单提交往往通过对dom的点击事件来操作,但是往往因为认为点击过快(少年手速挺快的嘛),或者因为响应等待使得用户误人为没操作而重复很多次点击,造成表 ...

随机推荐

  1. FTP文件夹错误:【打开FTP服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹】

    资源管理器访问FTP服务器报错,提示FTP文件夹错误:[打开FTP服务器上的文件夹时发生错误.请检查是否有权限访问该文件夹]. 详细信息: 200 Switching to ASCII mode. 2 ...

  2. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on

    解决错误 Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test ...

  3. win8 改win7 最全教程(包含可能遇到的所有问题)

    今日,帮一个朋友的把她的系统从win8 优雅降级到了win7,大家都知道win8改win7 不好改啊.......话不多,上本人的总结的教程. 首先 ,win8改win7 需要对系统格盘,这里的原因我 ...

  4. 微信开发 回复用户消息 .net C#

    前段时间开发了公司的微信 这里做个知识总结分享下经验,望一起学习..... 感觉后面写个系列的最好了 .... 企业需求: 给指定企业用户发送消息:如考勤信息. 企业通知.个人信息推送等等, /// ...

  5. Kotlin 基础

    Kotlinbase.kt @file:JvmName("kotlinbaseTest") import kotlin.math.roundToInt as atoInt fun ...

  6. 打不过AI就拉拢?ChatGPT和MidJourney已成我小秘书!

    为了体验AI,晓衡这两周战斗力爆棚了! 每天大概睡了四~五个小时,而且中午也没有休息过,但精神却还很亢奋. 直到周一下午,身体才有种被掏空的感觉,晚上 10 点就睡了.可能是兴奋劲还在,早晨不到 6 ...

  7. MySQL基础随笔记

    [1]SQL语言入门      我们都知道,数据库管理人员(DBA)通过数据库管理系统(DBMS)可以对数据库(DB)中的数据进行操作,但具体是如何操作的呢?这就涉及到我们本节要讲的SQL语言.SQL ...

  8. Spring--bean管理(easy)

    bean作用范围 利用同一个BookDao设置出来两个不同的对象,得到相同的地址: (默认为单例,即表现为同一个地址) 要是想要得到不同的地址,就需要我们在接口实现类的上面加上这样一个注解:(双例) ...

  9. 【2019CCPC秦皇岛:A】Angle Beats 分类讨论 (unordered_map 加 hash)

    题意:n个给定点,q个询问点,每次询问给出一个坐标A,问从n中选定两个点B,C,有多少种方案使得ABC是个直角三角形. 思路:直角三角形能想的就那几个,枚举边,枚举顶点,这个题都行,写的枚举顶点的,A ...

  10. Linux & 标准C语言学习 <DAY6>

    一.数组     什么是数组:变量的组合,是一种批量定义相同类型变量的方式     定义:  类型名 数组名[数量];             int arr[5];             注意:数 ...