在javascript中实现多线程

时间:2015-03-03 08:47:59

标签: javascript multithreading

var url = 'reports?type=travel&sttime=22/01/2015&endtime=2/03/2015'
$.get(url).done(function(response){console.log(response);});

这是我在2015年1月22日至2015年3月2日期间获取报告数据的代码。

因为时间跨度是40天而且响应将包含大量数据..并且获取数据需要1分钟以上。

现在我的问题是,我正在潜水40/10 = 4的日期 即2月22日至2月1日,2月2日至2月11日,2月12日至2月21日,2月21日至3月2日

我根据日期分区创建了四个URL。 有没有办法做多线程来实现所有的网址 一次获取数据并获取响应...以减少浏览器中的显示时间。

4 个答案:

答案 0 :(得分:1)

没关系。这里的瓶颈可能不是I / O,而是网络速度。如果您的客户端网络只能将N kB / s从您的服务器传输到他的计算机,那么打开2个或4个或10个并发连接并不重要。

更好的解决方案是对数据进行分页,仅获取客户端当前所需的部分。我怀疑任何用户都可以阅读大约两个月的大量数据。只获取客户可能感兴趣的部分,也可以下载第2页和第3页,然后在后台下载其余部分。

答案 1 :(得分:0)

不,没有。 JavaScript不支持多线程,因为浏览器本身的JavaScript解释器是单线程的。

答案 2 :(得分:0)

您不需要多线程来执行多个请求。请求是异步的,因此您可以在彼此之后进行调用,并且它们将同时启动:

$.get(url1).done(function(response){console.log(1, response);});
$.get(url2).done(function(response){console.log(2, response);});
$.get(url3).done(function(response){console.log(3, response);});
$.get(url4).done(function(response){console.log(4, response);});

响应到达时,将调用每个请求的done回调。

这是否真的会加速装载取决于瓶颈的位置。

您可以使用when method等待所有请求完成:

$.when(
  $.get(url1),
  $.get(url2),
  $.get(url3),
  $.get(url4)
).done(function(d1, d2, d3, d4){
  var result = d1.concat(d2, d3, d4);
  // ...
});

答案 3 :(得分:0)

我建议你使用HTML5 Web Workers。

http://www.w3schools.com/html/html5_webworkers.asp

这是适用于这些类型应用程序的唯一方法,但遗憾的是并非所有浏览器都支持它们。因此,您应该密切关注您想要建议的浏览器和版本。

另外,为了改善用户界面,您可以在客户端使用离线存储。

http://www.w3schools.com/html/html5_webstorage.asp

示例:我有一个介于1月20日至20日之间的数据。因此,当第一次用户加载网站时,我会获取所有数据并将其存储在客户端。现在,当用户在22日开始网站时,这次我将会只获取20日至22日之间的数据并再次将其存储在客户端。所以这只需要第一次,从第二次开始,它会改善用户交互,并且效率更高。大多数基于html5的现代网站都显示了见解将以类似的方式工作。